我正在尝试生成一个应该作为输入范围的函数,并且对于该范围应该返回该范围的所有可能的排列而不使用任何库。
例如:
per(range(3))
应该返回:
[[0, 1, 2], [1, 0, 2], [1, 2, 0], [0, 2, 1], [2, 0, 1], [2, 1, 0]]
我已完成以下操作,但我得到一个空列表。
def per(l):
return [l[i]+p for i in range(len(l))for p in per(l[:i] + l [i+1:])]
有谁知道为什么我得到空列表以及如何解决它?
答案 0 :(得分:1)
问题在于,当列表l
的长度为0
且返回空列表时,您的结束条件将是。因此,当列表的长度为1
时,内部循环从未实际运行,因此这也会返回一个空列表,并且这会继续发生,并且您总是会得到空列表。
修复将是在列表长度为1
时生成结束条件,并且您应该返回列表列表,而不是简单列表。示例 -
def per(l):
if len(l) == 1:
return [l]
return [[l[i]] + p for i in range(len(l))for p in per(l[:i] + l [i+1:])]
演示 -
>>> def per(l):
... if len(l) == 1:
... return [l]
... return [[l[i]] + p for i in range(len(l))for p in per(l[:i] + l [i+1:])]
...
>>>
>>> per([2])
[[2]]
>>> per([0,1,2])
[[0, 1, 2], [0, 2, 1], [1, 0, 2], [1, 2, 0], [2, 0, 1], [2, 1, 0]]
>>> per([0,1,2, 3])
[[0, 1, 2, 3], [0, 1, 3, 2], [0, 2, 1, 3], [0, 2, 3, 1], [0, 3, 1, 2], [0, 3, 2, 1], [1, 0, 2, 3], [1, 0, 3, 2], [1, 2, 0, 3], [1, 2, 3, 0], [1, 3, 0, 2], [1, 3, 2, 0], [2, 0, 1, 3], [2, 0, 3, 1], [2, 1, 0, 3], [2, 1, 3, 0], [2, 3, 0, 1], [2, 3, 1, 0], [3, 0, 1, 2], [3, 0, 2, 1], [3, 1, 0, 2], [3, 1, 2, 0], [3, 2, 0, 1], [3, 2, 1, 0]]
>>> len(per([0,1,2, 3]))
24