没有库的python中的排列

时间:2015-10-26 10:32:47

标签: python

我正在尝试生成一个应该作为输入范围的函数,并且对于该范围应该返回该范围的所有可能的排列而不使用任何库。

例如:

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:])]

有谁知道为什么我得到空列表以及如何解决它?

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