计算两个列表中的重复项数量

13 投票
5 回答
28189 浏览
提问于 2025-04-16 10:28
a = [1, 2, 9, 5, 1]
b = [9, 8, 7, 6, 5]
def filter_(x, y):
    count = 0
    for num in y:
        if num in x:
            count += 1
            return count

我想要计算两个列表中重复的元素数量。所以根据上面的内容,我想返回一个数字2,因为9和5在两个列表中都是出现的。

我试过类似的做法,但效果不是很好。

5 个回答

8

如果你想要计算重复出现的条目,基于集合的方法就不太管用;你需要用一些其他的方法,比如

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)。

10

你可以使用 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
34

更简单更好的方法:

>>> 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 放在了循环里面,这样一来,代码还没执行完就提前返回了。

撰写回答