我正在尝试在 Python 3 中创建一个 powerset。我找到了对该itertools
模块的引用,并且我使用了该页面上提供的 powerset 代码。问题:代码返回对itertools.chain
对象的引用,而我想访问 powerset 中的元素。我的问题:如何做到这一点?
非常感谢您的见解。
我正在尝试在 Python 3 中创建一个 powerset。我找到了对该itertools
模块的引用,并且我使用了该页面上提供的 powerset 代码。问题:代码返回对itertools.chain
对象的引用,而我想访问 powerset 中的元素。我的问题:如何做到这一点?
非常感谢您的见解。
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()
函数从迭代器中一一获取结果。
这是使用生成器的解决方案:
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
艾伦唐尼的答案是我会使用的,除了我会替换范围,
range(n+1)
因为空集被认为是幂集的一个元素。
这段代码可以很容易地重写为单行代码:
(combo for r in range(len(s) + 1) for combo in combinations(s, r))
您可以选择是用()
迭代器还是[]
列表包围它。