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

40 投票
3 回答
16324 浏览
提问于 2025-04-16 02:31

假设我有一个包含多个集合的列表,我想把这些集合合并成一个大集合。有没有办法用生成器表达式来做到这一点?换句话说,我怎么能直接把这个列表里的所有集合合并成一个 frozenset 呢?

3 个回答

4

嵌套的生成器表达式。不过我觉得它们有点难懂,所以KennyTM建议的方法可能更清晰。

frozenset(some_item for some_set in some_sets for some_item in some_set)
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'])
70

只需使用这个.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])

这个方法适用于任何可以迭代的集合。

撰写回答