我有以下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]时,它将追加原始列表的最后一个元素,而不是发送到递归方法中的较小列表。有什么办法解决这个问题?
这可以使用元组解决,但是我想知道是否存在使用列表的解决方案。
def subs(l): if l == []: return [[]] x = subs(l[1:]) return x + [[l[0]] + y for y in x]
结果:
>>> print (subs([1, 2, 3])) [[], [3], [2], [2, 3], [1], [1, 3], [1, 2], [1, 2, 3]]