找到两个迭代共享的匹配值数量的更有效方法?

slu*_*rrr 3 python arrays sorting list matching

编辑:寻找匹配的数量而不是匹配本身。不能用集合或[x for x in list1 if x in list2]类型方式解决。list1.count(x) if x in list2虽然有效。

假设您有两个列表,list1 和 list2,并且想要查找 list1 中的值与 list2 中的值匹配的次数。

我使用以下代码成功执行此任务 -

sum([x==y for x in list1 for y in list2])
Run Code Online (Sandbox Code Playgroud)

问题是这段代码不能有效地处理更大的列表。有没有比“double for”循环更快,更有效,我敢说更pythonic的方法来解决这个问题吗?

wim*_*wim 5

计数器支持与&运算符的多集交集:

>>> from collections import Counter
>>> list1 = list("abba")   
>>> list2 = list("bbanana") 
>>> c1 = Counter(list1)
>>> c2 = Counter(list2)
>>> sum(c1[k]*c2[k] for k in c1 & c2)  # O(n)
10
>>> sum([x==y for x in list1 for y in list2])  # O(n**2)
10
Run Code Online (Sandbox Code Playgroud)