Supponiamo di avere una lista di set e voglio ottenere l'unione su tutti i set in quella lista. C'è un modo per farlo usando un'espressione generatore? In altre parole, come posso creare l'unione su tutti i set in tale elenco direttamente come frozenset
?Come creare l'unione di molti set usando un'espressione di generatore?
risposta
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.
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
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 per intelligenza – aaronasterling
Questo è in effetti più chiaro, ma circa 4 volte più lento della soluzione di Kenny – fransua
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'])
Usa 'chain.from_iterable' se stai andando a' .chain (* args) '. – kennytm
@KennyTM: buon punto, ho apportato la modifica. –
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 –
Vedi anche: http://stackoverflow.com/ a/5182801/1959808 –