python - 在python中查找大量列表的交集

标签 python processing-efficiency computation

我有一个文件,每行包含空格分隔的数字。每行对应一个数字列表。
现在大约有 300,000 行这样的行(每行平均包含大约 100 个数字)。
我想找到所有此类列表的相互交集,即第一个列表与所有其他列表相交,然后第二个列表与所有其他列表相交,依此类推。
我正在使用

set(a) & set(b)  

其中 a 和 b 是我在双循环中迭代的列表。
但这花费了太多时间。例如:第一个列表与所有其他列表相交,大约需要 3 分钟。
我怎样才能有效地做到这一点? (可能与其他一些语言/工具一起使用)

最佳答案

你应该在这里使用生成器表达式,它们进行惰性求值并节省大量内存:

In [46]: from itertools import imap

In [47]: a = [[1,2,3], [2,3,4], [3,4,5]]

In [48]: reduce(set.intersection,imap(set,a))
Out[48]: set([3])

考虑到您的文件如下所示:

1 2 3
2 3 4
3 4 5

代码: 使用 itertools.combinations():

with open("abc.txt") as f:
    lines=(map(int,x.split()) for x in f)
    for x in combinations(lines,2):
        print x,'-->',reduce(set.intersection,imap(set,x))
   ....:         
([1, 2, 3], [2, 3, 4]) --> set([2, 3])
([1, 2, 3], [3, 4, 5]) --> set([3])
([2, 3, 4], [3, 4, 5]) --> set([3, 4])

关于python - 在python中查找大量列表的交集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14456201/

相关文章:

python - 应用凸函数的计算成本何时?

python - 无限递归和无限循环哪个更优化?

python - 在弹出窗口中输入文本,无法使用 python selenium 找到元素

Python 在没有标签的情况下从 JSON 中提取数据?

postgresql - 在带有 Postgres 的 Elixir 中,我怎样才能让数据库返回未使用的枚举值?

python - 用Python替换文本中的几个单词

python - 我如何*正确*在循环中运行 asyncio/aiohttp 请求?

Python - 效率 - 在调用filter()之前检查列表是否为空?

algorithm - 关于 8 拼图的 Hamming 和 Manhattan 优先级计算

algorithm - 使用 Horner 算法的高效多项式评估