如何编写代码以生成从1到N的排列

时间:2014-12-12 22:21:37

标签: python

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

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

  1. 重复[1] 2次,获取L1 = [[1], [1]]

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

  3. 然后我得到答案。

    但我有疑问:

    1. 当我重复[1] n=2次时,如果我use [1] * 2我会得到浅色副本。然后,当我改变一个,其他人将被改变。有没有办法得到与use [1] * 2相同但不是浅层副本的结果?
    2. 这样做的最佳方式是什么?
    3. 以下是我的代码,但它不起作用:

      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
      

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

有一个内置函数可以为您执行此操作: itertools.permutations

>>> import itertools
>>> a = '123'
>>> for i in itertools.permutations(a):
...     print(i)
... 
('1', '2', '3')
('1', '3', '2')
('2', '1', '3')
('2', '3', '1')
('3', '1', '2')
('3', '2', '1')

答案 2 :(得分:0)

如果你只需要重复[1],那么就像@ aa333所说,你可以使用[[1] for i in xrange(2)]

但我认为你真正想要的是将[[1, 2], [2, 1]]变成[[1, 2], [2, 1], [1, 2], [2, 1], [1, 2], [2, 1]]

在这种情况下,您需要以下内容:

[L[:] for _ in range(n) for L in permutation_list]

[:]确保每次都获得列表的单独(浅)副本。