簡體   English   中英

將集合與python中的集合列表相交

[英]Intersect a set with a list of sets in python

我有一個set s和一個set 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])

閱讀此問題時,我的第一個念頭是“確定,請使用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)的numpy 差異是由於numpyfor循環下推到C級這一事實,其本質上比Python for循環快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM