我有幾個不同的列表,我想將它們變成一個集合並用於從另一個集合中找出差異。讓我們稱他們爲A,B和C在Python中使用多個列表組合一個集合的首選方式是什麼
是要做到這一點set(A + B + C)
或set(A).union(set(B)).union(set(C))
會像重複或長度的數量A,B和C的某些屬性將影響這一決定的更好的方法?
會有任意數量的集?
我有幾個不同的列表,我想將它們變成一個集合並用於從另一個集合中找出差異。讓我們稱他們爲A,B和C在Python中使用多個列表組合一個集合的首選方式是什麼
是要做到這一點set(A + B + C)
或set(A).union(set(B)).union(set(C))
會像重複或長度的數量A,B和C的某些屬性將影響這一決定的更好的方法?
會有任意數量的集?
對於小列表,set(A + B + C)
工作正常。對於較大的列表,下面是更有效,因爲它不創建一個臨時表:
myset = set(A)
myset.update(B)
myset.update(C)
一種不同的方法使用itertools.chain
,這也是有效的,因爲它沒有創建臨時表:
import itertools
myset = set(itertools.chain(A, B, C))
下面是一些計時實驗:
import numpy as np
import itertools
for r in [10,100,1000,10000]:
A = list(np.random.randint(r, size=1000000))
B = list(np.random.randint(r, size=1000000))
%timeit set(A).update(B)
%timeit set(A+B)
%timeit set(itertools.chain(A, B))
print('---')
這裏是size = 1000
結果:
10000 loops, best of 3: 87.2 µs per loop
10000 loops, best of 3: 87.3 µs per loop
10000 loops, best of 3: 90.7 µs per loop
---
10000 loops, best of 3: 88.2 µs per loop
10000 loops, best of 3: 86.8 µs per loop
10000 loops, best of 3: 89.4 µs per loop
---
10000 loops, best of 3: 80.9 µs per loop
10000 loops, best of 3: 84.5 µs per loop
10000 loops, best of 3: 87 µs per loop
---
10000 loops, best of 3: 97.4 µs per loop
10000 loops, best of 3: 102 µs per loop
10000 loops, best of 3: 107 µs per loop
這裏是size = 1000000
結果:
10 loops, best of 3: 89 ms per loop
10 loops, best of 3: 106 ms per loop
10 loops, best of 3: 98.4 ms per loop
---
10 loops, best of 3: 89.1 ms per loop
10 loops, best of 3: 110 ms per loop
10 loops, best of 3: 94.2 ms per loop
---
10 loops, best of 3: 94.9 ms per loop
10 loops, best of 3: 109 ms per loop
10 loops, best of 3: 105 ms per loop
---
10 loops, best of 3: 115 ms per loop
10 loops, best of 3: 143 ms per loop
10 loops, best of 3: 138 ms per loop
所以,update()
似乎比其他兩種方法稍快。但是,我不認爲時差很重要。
我不認爲你可以使用+來添加集 – primero
有各種各樣的想法在http://stackoverflow.com/questions/2151517/pythonic-way-to-create-union-of-all-values-包含在多個列表中 –
好啊,我會更新我的問題 - 我錯誤地認爲'+'會在幕後執行一組聯合。 –