【发布时间】:2015-12-11 19:59:18
【问题描述】:
我想知道是否有一种相对简单的方法可以迭代地查找列表的所有子集。使用递归,这很容易完成并且非常简洁......
def partial(alist, pos, chosen):
if pos == len(alist):
return [chosen]
else:
return partial(a list, pos+1, chosen) \
+ partial(alist, pos+1, chosen + [alist[pos]])
这将返回一个列表列表,其中包含列表的所有子集。
有没有办法迭代地做这样的事情而不会过于复杂,或者递归是最好的方法?一些伪代码或解释迭代方法的东西会很有帮助。我知道itertools 很有帮助,但如果可能的话,我想要一个不需要它的解决方案。
【问题讨论】:
-
只是为了澄清
partial([a, b, c])创建:[[a], [b], [c], [a,b], [a,c], [b,c], [a,b,c]]? -
@shuttle87 是的,这就是它的作用,它还包括空列表,但这不是必需的
-
这里使用的其他参数是什么?如果唯一的任务是生成power set,那么使用 itertools 相当容易。
-
@shuttle87 其他参数是计数器和列表列表,所以你可以这样运行它
partial(list, 0,[])。 -
如果是用于创建 powersets,我会看看 powerset of a given set - 它同时列出了生成器和线性 itertools 方法
标签: python algorithm recursion