计算2个列表之间的重复项

时间:2011-01-23 16:49:03

标签: python list loops

a = [1, 2, 9, 5, 1]
b = [9, 8, 7, 6, 5]

我想计算两个列表之间重复的数量。因此,使用上面的内容,我想返回2的计数,因为9和5对于两个列表都是通用的。

我尝试过类似的东西,但是效果不好。

def filter_(x, y):
    count = 0
    for num in y:
        if num in x:
            count += 1
            return count

5 个答案:

答案 0 :(得分:22)

更短的方式更好:

>>> a = [1, 2, 9, 5, 1]
>>> b = [9, 8, 7, 6, 5]
>>> len(set(a) & set(b))     # & is intersection - elements common to both
2 

为什么您的代码不起作用:

>>> def filter_(x, y):
...     count = 0
...     for num in y:
...             if num in x:
...                     count += 1
...     return count
... 
>>> filter_(a, b)
2

你的return count在for循环中,它返回时没有执行完毕。

答案 1 :(得分:9)

您可以使用set.intersection

>>> set(a).intersection(set(b)) # or just: set(a).intersection(b)
set([9, 5])

或者,对于交叉点的长度:

>>> len(set(a).intersection(set(b)))
2

或者,更简洁:

>>> len(set(a) & set(b))
2

答案 2 :(得分:5)

如果您希望计算多项条目,则基于集合的解决方案将失败;你需要像

这样的东西
from collections import Counter

def numDups(a, b):
    if len(a)>len(b):
        a,b = b,a

    a_count = Counter(a)
    b_count = Counter(b)

    return sum(min(b_count[ak], av) for ak,av in a_count.iteritems())

然后

numDups([1,1,2,3], [1,1,1,1,1])

返回2.此时的运行时间为O(n + m)。

此外,您的初始解决方案

for num in y:
    if num in x:
        count += 1

错误 - 适用于[1,2,3,3]和[1,1,1,1,1,3],您的代码将返回3或6,既不这是正确的(答案应该是2)。

答案 3 :(得分:3)

将它们转换为set并计算交点。

 len(set(a).intersection(set(b)))

答案 4 :(得分:1)

以下解决方案还考虑了列表中的重复元素:

from collections import Counter

def number_of_duplicates(list_a, list_b):
    count_a = Counter(list_a)
    count_b = Counter(list_b)

    common_keys = set(count_a.keys()).intersection(count_b.keys())
    return sum(min(count_a[key], count_b[key]) for key in common_keys)

然后number_of_duplicates([1, 2, 2, 2, 3], [1, 2, 2, 4])会产生预期的3

请注意@Hugh Bothwell也提供了类似的解决方案,但如果元素仅包含在较短的列表中,它有时会抛出KeyError