我正在尝试匹配两个列表,但我也想要重复匹配。我不能使用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]
答案 0 :(得分:3)
您可以使用list comprehesion检查并返回a
中的每个项目(如果b
中存在,如下所示:
[item for item in a if item in b]
如果您只想要a
和b
中的元素(以涵盖评论中@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]