Python - 在两个列表中获得重复匹配

时间:2016-12-06 07:23:04

标签: python-2.7 python-3.x

我正在尝试匹配两个列表,但我也想要重复匹配。我不能使用set,因为这只会在下面的第二个例子中给出{3}。

a = [1,2,3,4]
b = [3,3,4,5]
return [3,4]

a = [1,2,3,3]
b = [3,3,4,5]
return [3,3]

2 个答案:

答案 0 :(得分:3)

您可以使用list comprehesion检查并返回a中的每个项目(如果b中存在,如下所示:

[item for item in a if item in b]

如果您只想要ab中的元素(以涵盖评论中@kabanus提到的案例),您可以使用以下内容:

[item for item in set(a) for i in range(min(a.count(item), b.count(item)))]

<强>输出:

>>> a = [1, 2, 3, 4]
>>> b = [3, 3, 4, 5]
>>> [item for item in set(a) for i in range(min(a.count(item), b.count(item)))]
[3, 4]
>>>
>>> a = [1, 2, 3, 3]
>>> b = [3, 3, 4, 5]
>>> [item for item in set(a) for i in range(min(a.count(item), b.count(item)))]
[3, 3]
>>> 
>>> a = [3, 3, 4]
>>> b = [4, 4, 3]
>>> [item for item in set(a) for i in range(min(a.count(item), b.count(item)))]
[3, 4]

答案 1 :(得分:1)

尝试类似的事情(如果顺序并不重要),Python 2:

from collections import Counter

a = [1,2,3,4]
b = [3,3,4,5]
ca=Counter(a)
cb=Counter(b)
print sum([[x]*min(ca[x],cb[x]) for x in set(a)],[])

这应该返回所有重复匹配的列表,它们重复的次数,除了将相同的元素分组在一起之外没有特定的排序。以上示例的输出为:

[3,4]

我假设你错过了4.你得到的另一个例子是:

[3,3]