首页 > 解决方案 > 我们如何创建返回 Set 而不是 tuple 或 list 的 Powerset

问题描述

我尝试创建函数来返回给定集的幂集。有很多示例,但所有示例都只是返回元组或列表,似乎无法转换为对象集。

from itertools import chain, combinations    
def powerset(iterable):
    "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
    s = set(iterable)
    return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))    

g = [powerset({1,2,3})]
result = set(*g)
print(result)

无论如何我可以将结果转换为对象集吗?我期望结果 {{},{1},{2},{3},{1,2},{1,3},{2,3},{1,2,3} }

标签: pythonset

解决方案


只需将其包装起来map(frozenset, ...)即可将所有tuples转换frozenset为相同值的 s:

def powerset(iterable):
    "powerset([1,2,3]) --> frozenset() frozenset({1}) frozenset({2}) frozenset({3}) frozenset({1, 2}) frozenset({1, 3}) frozenset({2, 3}) frozenset({1, 2, 3})"
    s = sorted(set(iterable))  # Sorted to get predictable ordering from combinations
    return map(frozenset, chain.from_iterable(combinations(s, r) for r in range(len(s)+1)))

如果你没有得到set所有结果,你可以使用map(set, ...),但是sets 不是 another 的合法成员set,虽然frozenset是,所以map(frozenset, ...)在这种情况下你想要什么。

请记住,set(and frozenset) 是任意排序的,因此结果可能与您期望的顺序不同,但它相当于您感兴趣的输出。


推荐阅读