将集合与python中的集合列表相交

时间:2018-11-15 19:59:17

标签: python python-3.x set

我有一组s和一组l,如下所示。

s = {1,2,3,4}
l = [{1}, {1,2,3}, {3}]

输出应为

out = [{1}, {1,2,3}, {3}]

我正在使用以下代码来完成它。但是我希望会有更快的方法吗?也许是某种广播?

out = [i.intersection(s) for i in l]

编辑

列表l的长度可以为1000个元素。

我的最终目标是创建一个矩阵,该矩阵的长度为l的元素的成对相交。因此sl的元素。

out_matrix = list()
for s in l:
    out_matrix.append([len(i.intersection(s)) for i in l])

1 个答案:

答案 0 :(得分:1)

阅读此问题时,我的第一个念头是“确定,请使用numpy”。然后我决定做一些测试:

import numpy as np
from timeit import Timer

s = {1, 2, 3, 4}
l = [{1}, {1, 2, 3}, {3}] * 1000  # 3000 elements
arr = np.array(l)


def list_comp():
    [i.intersection(s) for i in l]


def numpy_arr():
    arr & s

print(min(Timer(list_comp).repeat(500, 500)))
print(min(Timer(numpy_arr).repeat(500, 500)))

此输出

# 0.05513364499999995
# 0.035647999999999236

所以numpy确实快一点。真的值得吗?不确定。对于3000个元素的列表,~0.02秒的差异可以忽略不计(尤其是考虑到我的测试甚至没有考虑创建arr所花费的时间这一事实)。

请记住,即使使用numpy,我们仍然处于O(n)的境地。差异是由于numpyfor循环推到C级,这比Python for循环固有地快。