如何使用生成器表达式创建多个集合的并集?

40

假设我有一组集合,我想要获取该列表中所有集合的并集。是否有办法使用生成器表达式来直接创建这个并集,以 frozenset 的形式呈现?


参见:https://dev59.com/e2435IYBdhLWcg3w1z0t#5182801 - 0 _
3个回答

68

只需使用.union()方法即可。

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

这适用于任何可迭代的可迭代对象。


1
遵循vaultah的建议,不再适用于空列表。 - Nick Matteo

6

我猜您想要避免在构建并集时产生frozenset对象的中间创建过程?

这里有一种方法。 注意:原来使用了itertools.chain(),但是如Kenny的评论所述,下面的版本稍微好一些:

import itertools

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

像这样调用:

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

如果你要使用.chain(*args),请使用chain.from_iterable - kennytm
3
我的性能测试结果(使用Python 3):当集合数量小于10000时,KennyTM的响应略快,但集合数量为30000时,该响应速度稍快。 - Taha Jahangir

4
嵌套生成器表达式。但我认为它们有点晦涩,所以 KennyTM 建议的方法可能更清晰。
frozenset(some_item for some_set in some_sets for some_item in some_set)

这确实更清晰,但比Kenny的解决方案慢大约4倍。 - fransua

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接