python - 如何编写代码来生成从 1 到 N 的排列

标签 python

嗨:我正在尝试编写 python 代码来生成排列:要获得 perm(n),我会将 n 插入到 的位置重复 perm(n-1) n 次的结果为 0n-1

例如,要获得perm(2),我会这样做:

  1. 重复[1] 2次,得到L1 = [[1], [1]]

  2. 对于L1中的每个列表,在0和1的位置插入2,得到[[1,2], [2,1]] .

然后我就得到了答案。

但我有疑问:

  1. 当我重复[1] n=2次时,如果我使用[1] * 2我将得到浅拷贝。然后当我改变一个时,其他的也会改变。有没有办法获得与 use [1] * 2 相同的结果,但不是浅复制?
  2. 最好的方法是什么?

以下是我的代码,但它不起作用:

def perm(n):
    res = []
    if n == 1:
        res = [1]
    else:
        s = [perm(n - 1) for i in range(n)]
        s2 = [[item] for sublist in s for item in sublist]
        for i in range(n):
            for j in range(len(perm(n - 1))):
                res.append(s2[i * len(perm(n - 1)) + j].insert(i, n))
    return res

最佳答案

[[1] for i in xrange(2)]

这会起作用。创建新列表,而不仅仅是添加对现有列表的引用。

关于python - 如何编写代码来生成从 1 到 N 的排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27453023/

相关文章:

python - 以对数刻度绘制 x 和 y 轴

python - 我可以删除 pipenv 缓存文件夹吗?如何安全地做

Python [子]进程向 Node [父]进程发送消息

javascript - 使用 HKDF key 的 Crypto-js 加密和 Python 解密

python - 一个列表理解中的两个 for 循环分别

python - 将 CSV 转换为 XML

python - Python 字典中的反向键(由列表组成)和值

Python 碎片 : 400 response from Form Request

c# - 像 C# 一样模仿 Python(纯)虚函数

python - 如何在 python 中转义包含单引号、双引号 (',",`) 等所有字符的 Linux 命令?