将一组冻结集合合并为一个集合的Python代码

9

我正在尝试合并一个集合中定义的集合,以下是我的代码:

a = frozenset([1,3,4])
b = frozenset([1,2,3,4,5])
s = set()
s.add(a)
s.add(b)
merged = set(itertools.chain.from_iterable(s))

在实践中,s 可能包含许多个 frozensets。有更好的方法吗?感觉像是一个 reduce 情况,但是...

from functools import reduce
merged = reduce(|, s)

无法工作。

另外

merged = reduce(set.add, s)

这不起作用是因为s的元素是frozensets。


3
| 作为一个单独的函数被称为 operator.or_ - Josh Lee
2个回答

12
如果您有两个以上的 frozenset,请创建一个容器(例如列表)并应用 union 操作:
listoffrozensets = [a,b,...]
frozenset().union(*listoffrozensets)

3
其实没有什么区别,但直接从类中使用方法而不需要实例化一个无用的实例:frozenset.union - juanpa.arrivillaga
1
我认为这是做这件事的“正确”方式。reduce 可能不太高效。无论如何,在 Python 中,不鼓励使用 reduce。这就是它在 Python 3 的 built-ins 命名空间中被移除的原因。 - juanpa.arrivillaga
@juanpa.arrivillaga 对,至少根据我的%timeit报告,unionreduce快约20%。 - DYZ
1
当我使用listoffrozensets=[]时遇到了一个问题,然后出现了错误。但是frozenset().union(*[])仍然能正常工作。 - nos
@nos 很好的观点!frozenset().union(*listoffrozensets) 也可以。 - DYZ

9

您可以使用reduce函数,只需使用适当的函数即可:

>>> from functools import reduce
>>> frozenset.union
<method 'union' of 'frozenset' objects>
>>> reduce(frozenset.union, [a,b])
frozenset({1, 2, 3, 4, 5})
>>>

你的想法是正确的,使用 | 运算符可以实现相应功能。但是在Python中,| 是一个运算符,不能替代函数。如果需要使用函数实现该功能,请导入operator模块!

>>> import operator
>>> reduce(operator.or_, [a,b])
frozenset({1, 2, 3, 4, 5})

请注意,如果您正在使用typing,则需要使用例如frozenset[int].union来避免出现“union类型部分未知”的情况。 - davetapley

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