2010-08-09 7 views

risposta

43

Basta usare the .union() method.

>>> l = [set([1,2,3]), set([4,5,6]), set([1,4,9])] 
>>> frozenset().union(*l) 
frozenset([1, 2, 3, 4, 5, 6, 9]) 

Questo funziona per qualsiasi iterable iterable.

+1

Notando semplicemente che è più pulito usare 'frozenset.union' come metodo non associato, se' l' contiene 'frozenset's ad es. 'Frozenset.union (* l)'. Lo stesso per 'set.union'. – vaultah

4

Espressione di generatore annidato. Ma penso che siano un po 'criptici, quindi il modo in cui KennyTM ha suggerito potrebbe essere più chiaro.

frozenset(some_item for some_set in some_sets for some_item in some_set) 
+1

+1 per intelligenza – aaronasterling

+0

Questo è in effetti più chiaro, ma circa 4 volte più lento della soluzione di Kenny – fransua

5

Suppongo che ciò che si sta cercando di evitare è creazioni intermedi di oggetti frozenset come si sta costruendo il sindacato?

Ecco un modo per farlo. NOTA: questa originariamente utilizzato itertools.chain() ma, come note di commento di Kenny, la versione di seguito è leggermente migliore:

import itertools 

def mkunion(*args): 
    return frozenset(itertools.chain.from_iterable(args)) 

Invoke in questo modo:

a = set(['a','b','c']) 
b = set(['a','e','f']) 
c = mkunion(a,b)  # => frozenset(['a', 'c', 'b', 'e', 'f']) 
+0

Usa 'chain.from_iterable' se stai andando a' .chain (* args) '. – kennytm

+0

@KennyTM: buon punto, ho apportato la modifica. –

+1

I risultati del test delle prestazioni (con python 3): la risposta di KennyTM è leggermente più veloce quando il numero di set <10000, ma questa risposta è leggermente più veloce con 30000 set –

Problemi correlati