嗨:我正在尝试编写python代码以生成排列:要获得perm(n)
,我会将n
插入0
到n-1
的位置重复perm(n-1) n
次的结果。
例如,要获得perm(2)
,我会这样做:
重复[1]
2次,获取L1 = [[1], [1]]
对于L1
中的每个列表,在0和1的位置插入2以获得[[1,2], [2,1]]
。
然后我得到答案。
但我有疑问:
[1]
n=2
次时,如果我use [1] * 2
我会得到浅色副本。然后,当我改变一个,其他人将被改变。有没有办法得到与use [1] * 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
答案 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]
[:]
确保每次都获得列表的单独(浅)副本。