python - 查找两个可迭代对象共享的匹配值数量的更有效方法?

标签 python arrays list sorting 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])

问题是这段代码无法有效地处理更大的列表。有没有比“double for”循环更快、更高效、更像 pythonic 的方法来解决这个问题?

最佳答案

计数器通过 & 运算符支持多集交集:

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

关于python - 查找两个可迭代对象共享的匹配值数量的更有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58597916/

相关文章:

python - 如何让 Pyplot 识别曲线图中的高原(几乎为 0 斜率),然后打印高原的 ydata 值?

python - 根据自定义条件过滤 csv 中的行

c++ - XDR 序列化可变长度字符串数组

java - 渲染图 block Java Libgdx

java - 返回数组列表对象 java 中的列表

r - 将向量与向量列表匹配

python - 如何判断 sys.stdout 是否已在 Python 中刷新

python - Django 1.9.3 - 如何将 HTML 模板传递给索引模板

javascript - 需要显示for循环数组中的所有数字

python - 函数中只允许循环奇数