Supposons que j'ai une liste d'ensembles et que je veux obtenir l'union sur tous les ensembles de cette liste. Est-il possible de le faire en utilisant une expression de générateur? En d'autres termes, comment puis-je créer l'union sur tous les ensembles dans cette liste directement comme frozenset
?Comment créer l'union de plusieurs ensembles en utilisant une expression de générateur?
Répondre
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.
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
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 pour l'intelligence – aaronasterling
Ceci est en effet plus clair, mais environ 4 fois plus lent que la solution de Kenny – fransua
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'])
Utilisez 'chain.from_iterable' si vous allez à' .chain (* args) '. – kennytm
@KennyTM: Bon point, j'ai fait le changement. –
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 –
Voir aussi: http://stackoverflow.com/ A/5182801/1959808 –