2010-08-09 23 views

Répondre

43

Utilisez simplement 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]) 

Cela fonctionne pour tout itérable des itérations.

+1

Notez simplement qu'il est plus propre d'utiliser 'frozenset.union' comme méthode non liée, si' l' contient 'frozenset's par exemple 'frozenset.union (* l)'. Pareil pour 'set.union'. – vaultah

4

Expression de générateur imbriqué. Mais je pense qu'ils sont un peu énigmatiques, donc la façon dont KennyTM a suggéré pourrait être plus claire.

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

+1 pour l'intelligence – aaronasterling

+0

Ceci est en effet plus clair, mais environ 4 fois plus lent que la solution de Kenny – fransua

5

Je suppose que ce que vous essayez d'éviter est les créations d'objets intermédiaires frozenset que vous construisez le syndicat?

Voici une façon de le faire. NOTE: cette origine utilisé itertools.chain() mais, comme les notes de commentaire de Kenny, la version ci-dessous est un peu mieux:

import itertools 

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

Invoke comme ceci:

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

Utilisez 'chain.from_iterable' si vous allez à' .chain (* args) '. – kennytm

+0

@KennyTM: Bon point, j'ai fait le changement. –

+1

Mes résultats de test de performance (avec python 3): la réponse de KennyTM est légèrement plus rapide lorsque le nombre d'ensembles est <10000, mais cette réponse est légèrement plus rapide avec 30000 ensembles –