Python - 如何在两个列表中获取重复的匹配项

3

我正在尝试匹配两个列表,但我希望也能捕获重复的匹配项。我不能使用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]

1
c=[x for x in a if x in b] - Jean-François Fabre
@Jean-François Fabre我不认为这就是他的意思。我想a=[3,3];b=[3]只会匹配一次。这是一个列表交集。 - kabanus
我有疑问,否则我会回答的。 - Jean-François Fabre
2个回答

3
你可以使用列表解析来检查并返回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]

请看我对楼主的评论。我认为 a=[3,3];b=[3] 只应该匹配一次,就像交集一样,否则会出现两次匹配。 - kabanus
如果输入 a=[3,3,4];b=[4,4,3] 时,您的函数会失败(因为数字 4 出现了两次),但是几乎就可以了。如果您能让它正常工作,我会给您点赞。这个条件实在太简单了。 - kabanus

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]

是的,我确实错过了4(已编辑),我认为这样做就是我想要的,谢谢! - jackonator

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接