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
答案 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
。