两个列表的共同元素包括重复

时间:2018-04-11 13:02:45

标签: python list intersection

我有两个清单:

a = ['item.1','item.2','item.3', 'another_item'] 
b = ['item.4','item.5', 'another_item']

我会将元素拆分为

a = ['item', 'item', 'item', 'another_item']
b = ['item', 'item', 'another_item']

我想找到实际的共享项目,最后以

结束
c = ['item','item', 'another_item']

set(a).intersection(b)会返回['item', 'another_item']

c = [x for x in list1 if x in list2]返回['item', 'item', 'item', 'another_item']

我的列表实际上包含多个出现的其他项目,所以我不能只找出哪个列表包含“item”的最少出现次数并迭代它,如果它包含更多出现的'another_item'。我还能尝试什么?

2 个答案:

答案 0 :(得分:4)

来自Counter

collections能够处理多重集:

>>> from collections import Counter

>>> a = ['item', 'item', 'item', 'another_item']
>>> b = ['item', 'item', 'another_item']

# create counter objects for a and b
>>> ca = Counter(a)
>>> cb = Counter(b)

>>> intersection = ca & cb
>>> intersection
Counter({'item': 2, 'another_item': 1})

>>> list(intersection.elements())
['item', 'item', 'another_item']

答案 1 :(得分:2)

您可以使用:

a = ['item','item','item', 'another_item']
b = ['item','item', 'another_item']
b, common = b[:], [ e for e in a if e in b and (b.pop(b.index(e)) or True)]
print(common) # ['item', 'item', 'another_item']

这样做的缺点是需要创建其中一个列表的副本,因为列表理解必须删除迭代的项目。但是如果你切换a和b,它将会起作用。