2015-09-09 26 views
2

我有幾個不同的列表,我想將它們變成一個集合並用於從另一個集合中找出差異。讓我們稱他們爲A,B和C在Python中使用多個列表組合一個集合的首選方式是什麼

是要做到這一點set(A + B + C)set(A).union(set(B)).union(set(C))

會像重複或長度的數量A,B和C的某些屬性將影響這一決定的更好的方法?

會有任意數量的集?

+3

我不認爲你可以使用+來添加集 – primero

+1

有各種各樣的想法在http://stackoverflow.com/questions/2151517/pythonic-way-to-create-union-of-all-values-包含在多個列表中 –

+0

好啊,我會更新我的問題 - 我錯誤地認爲'+'會在幕後執行一組聯合。 –

回答

6

對於小列表,set(A + B + C)工作正常。對於較大的列表,下面是更有效,因爲它不創建一個臨時表:

myset = set(A) 
myset.update(B) 
myset.update(C) 

一種不同的方法使用itertools.chain,這也是有效的,因爲它沒有創建臨時表:

import itertools 
myset = set(itertools.chain(A, B, C)) 
+0

事實上,事實證明,在這種情況下,itertools.chain並不比「A + B + C」更快,即使是10000個元素的列表(時序數據:A + B + C 2.33ms,update '2.09ms,'chain' 2.23ms) – nneonneo

+0

結果很奇怪,請參閱http://stackoverflow.com/questions/32483539/why-is-creating-a-set-from-a-concatenated-list-faster-than -using-update - 對於大型列表,A + B + C實際上更快...... – nneonneo

3

下面是一些計時實驗:

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()似乎比其他兩種方法稍快。但是,我不認爲時差很重要。

+0

Time Hai Vu的'itertools.chain'方法也是如此。 – nneonneo

+0

@nneonneo更新。 – Sait

+0

謝謝你做一些時間測試。 –

相關問題