11

我正在尝试在 Python 3 中创建一个 powerset。我找到了对该itertools 模块的引用,并且我使用了该页面上提供的 powerset 代码。问题:代码返回对itertools.chain对象的引用,而我想访问 powerset 中的元素。我的问题:如何做到这一点?

非常感谢您的见解。

4

3 回答 3

35

itertools函数根据需要返回迭代器,即懒惰地产生结果的对象。

您可以使用循环遍历对象,也可以for通过调用将结果转换为列表list()

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 = list(iterable)
    return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))

for result in powerset([1, 2, 3]):
    print(result)

results = list(powerset([1, 2, 3]))
print(results)

您也可以将对象存储在变量中,并使用该next()函数从迭代器中一一获取结果。

于 2013-08-03T17:52:10.280 回答
2

这是使用生成器的解决方案:

from itertools import combinations

def all_combos(s):
    n = len(s)
    for r in range(1, n+1):
        for combo in combinations(s, r):
            yield combo
于 2018-12-11T15:01:42.893 回答
1

艾伦唐尼的答案是我会使用的,除了我会替换范围, range(n+1)因为空集被认为是幂集的一个元素。

这段代码可以很容易地重写为单行代码:

(combo for r in range(len(s) + 1) for combo in combinations(s, r))

您可以选择是用()迭代器还是[]列表包围它。

于 2020-07-29T01:47:36.093 回答