python - 没有库的python中的排列

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

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

最佳答案

问题是当列表 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

关于python - 没有库的python中的排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33343528/

相关文章:

python - 从系列更改索引创建 Pandas 数据框

python - 在 Pandas 的下一个 K 连续行中找到最高值?

python - 属性错误 : 'module' object has no attribute 'TwilioRestClient'

python - 多幅图像的时间中值图像

python - 如何按年份过滤 sqlalchemy 中的查询(日期时间列)

python - 'pip uninstall sklearn scikit-learn'这两条命令都卡住了,如何正确删除?

python - 保存后维护通过信号填充的模型之间的关系

python - Jupyter 中的 "ImportError: No module named ' jwt '"

python - 让 Selenium 捕获所有的 cookies

javascript - 使用selenium通过window.open下载文件