lists = [[a,b,c,d],[a,b,c,d,e],[a,b,c,x],[a,b,c,d,e,f]....lots]
common_items = [a,b,c]
uncommon_items = [[d], [d,e], [x], [d,e,f]]
common_elements(lists[0],lists[1])
def common_elements(list1, list2):
return [element for element in list1 if element in list2]
很多关于 SO 的答案只能同时处理两个列表。需要一个可以处理任意数量列表并返回两个列表的列表。
注意:列表的顺序很重要,它忽略了集合。 注意:必须是每个列表中最低的常见项目,而不是仅基于列表中的第一个列表。
最佳答案
最简单的方法是使用集合,但你会失去顺序。
lists = [['a','b','c','d'],
['a','b','c','d','e'],
['a','b','c','x'],
['a','b','c','d','e','f']]
sets = map(set, lists)
common = set.intersection(*sets)
uncommon = [s-common for s in sets]
print common # set(['a', 'c', 'b'])
print uncommon # [set(['d']), set(['e', 'd']), set(['x']), set(['e', 'd', 'f'])]
集合是表示常见元素的最佳方式。您可以通过使用不同的列表理解来维护不常见元素的顺序。
uncommon = [[x for x in l if x not in common] for l in lists]
print uncommon # [['d'], ['d', 'e'], ['x'], ['d', 'e', 'f']]
假设 common
的元素在所有列表中以相同的顺序出现,那么您可以将 common 集转换为列表。
common = [x for x in lists[0] if x in common]
关于Python:返回列表中顺序出现的常见项目的列表以及不常见项目的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20038900/