Python比较列表的列表

标签 python performance list compare

我有一个包含 10**7 个列表的列表,格式如下:

big_list = [[1, 2, 3, 4, 5, 6], [2, 3, 4, 5, 6, 7], [2, 3, 4, 26, 33, 40], [10, 23, 33, 45, 46, 47]]

每个列表包含 6 个唯一的整数。

我需要将每个列表与另一个列表进行比较:

lst = [1, 3, 4, 10, 23, 46]

并返回那些列表项交集小于3的列表项。 所以新列表将是:

new_list = [[2, 3, 4, 5, 6, 7], [2, 3, 4, 26, 33, 40]]

目前我使用的是set intersection,但运行时间大约需要30秒

最佳答案

import numpy as np
biglist = [[1, 2, 3, 4, 5, 6], [2, 3, 4, 5, 6, 7], [2, 3, 4, 26, 33, 40], [10, 23, 33, 45, 46, 47]]
oldlist = [1, 3, 4, 10, 23, 46]

b = np.array(biglist)
b[np.array([(b == x).any(axis=1) for x in oldlist]).sum(axis=0) < 3]

返回

array([[ 2,  3,  4,  5,  6,  7],
       [ 2,  3,  4, 26, 33, 40]])

创建 numpy 数组需要一些时间,但最后一行的速度大约是具有集合交集的列表理解的两倍(对于 1e6 列表)。

编辑:以下行比我上面的代码更快,并且需要更少的内存:

b[reduce(np.add, ((b == x).any(axis=1).astype(np.int) for x in oldlist)) < 3]

关于Python比较列表的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11096975/

相关文章:

javascript - Redux:连接组件列表的性能

python - 如果我不使用集合,如何检查一个列表中的值是否在另一个列表中,并在 Python 中使用 if 语句的一行?

python - 在seaborn上绘制y轴网格和kdeplot之间的交集

python - 如何在Python中测量用户所有进程的总内存使用情况

python - 编程自动循环

performance - Azure Redis 内存使用情况(w3wp.exe 转储)洞察

performance - 在 Neo4j 中使用 FOREACH 时删除关系

javascript - Alfresco:Javascript 数据列表创建

python - 不同数字列表中的第一个公共(public)元素

python - 评估 python 中的 for 循环,包含带有嵌入 for 循环的数组