sum(iterable, [])不创建列表列表。它实际上是把东西弄平了。在
yield (sum(...))在这一行中,您只生成一个项目,所有组合的扁平列表。在
对于python2.X,sum([(map(list, combinations(arr, i))) ...])可以工作,但是在python3.X中map不再返回列表。相反,它返回一个map对象。因此,如果python3.X上的任何人只需将其转换为list(map(.....)),以便在3.X上运行
我想你真正想要的是这样的:from itertools import combinations
def makeCombos(arr):
for i in range(len(arr) + 1):
for combo in map(list, combinations(arr, i)):
yield combo
#Or call next
combos = makeCombos([1, 2, 3, 4, 5])
for combo in combos:
print combo
单行程序注释的另一种选择:
我们可以返回一个生成器对象,然后像使用yield一样循环使用。在
例如-
^{pr2}$
至于这是“Python”,我真的不会这么说。实际上我更喜欢嵌套的forloop,它的可读性要高得多。在
尽管如此,我们仍然可以尝试通过一些“技巧”来清理/压缩它from itertools import combinations as cs #or some other name)
def makeCombos(arr):
return (c for i in range(len(arr) + 1) for c in map(list, cs(arr, i)))
但是,现在您已经失去了所有的可读性,这看起来就像在Perl中看到的一样。(恐怖!)在
输出:[]
[1]
[2]
[3]
[4]
[5]
[1, 2]
[1, 3]
[1, 4]
[1, 5]
[2, 3]
[2, 4]
[2, 5]
[3, 4]
[3, 5]
[4, 5]
[1, 2, 3]
[1, 2, 4]
[1, 2, 5]
[1, 3, 4]
[1, 3, 5]
[1, 4, 5]
[2, 3, 4]
[2, 3, 5]
[2, 4, 5]
[3, 4, 5]
[1, 2, 3, 4]
[1, 2, 3, 5]
[1, 2, 4, 5]
[1, 3, 4, 5]
[2, 3, 4, 5]
[1, 2, 3, 4, 5]