【发布时间】:2014-12-07 13:41:49
【问题描述】:
我有以下 python 函数来打印数字列表的所有子集:
def subs(l):
if len(l) == 1:
return [l]
res = []
for sub in subs(l[0:-1]):
res.append(sub)
res.append([l[-1]])
res.append(sub+[l[-1]])
return res
li = [2, 3, 5, 8]
print(subs(li))
这会返回:
[[2], [8], [2, 8], [5], [8], [5, 8], [2, 5], [8], [2, 5, 8], [3], [8], [3, 8], [5], [8], [5, 8], [3, 5], [8], [3, 5, 8], [2, 3], [8], [2, 3, 8], [5], [8], [5, 8], [2, 3, 5], [8], [2, 3, 5, 8]]
这不是预期的答案。看起来 python 通过引用将列表 l 带入函数中。因此,当我追加 l[-1] 时,它会追加原始列表的最后一个元素,而不是发送到递归方法中的较小列表。有没有办法解决这个问题?
这可以使用元组解决,但我想知道是否有使用列表的解决方案。
【问题讨论】:
-
预期的答案是什么?这看起来就是你要找的东西。显然这种方法在这个过程中也积累了很多重复。
-
你想要像
[list(itertools.permutations(li[:x])) for x in range(len(li))]这样的一维列表吗? -
@Cocksure 我的错误,python实际上正在做它应该做的事情:)。我认为它是在函数中通过引用来获取列表的。所以 l[-1] 在上述情况下总是 8 。但是 l[-1] 在递归调用中是 3,5,8。这个修改后的代码解决了这个问题:def subs(l): if len(l) == 1: return [l] res = [] subsets = subs(l[0:-1]) res = res+subsets res.append ([l[-1]]) for sub 在子集中: res.append(sub+[l[-1]]) return res
标签: python arrays list recursion functional-programming