2014-12-12 2 views
1

안녕 : 나는 순열을 생성하기 위해 파이썬 코드를 작성하는 것을 시도하고있다 : perm(n)을 얻기 위해, 나는 반복의 결과에 n-10의 위치에 n를 삽입합니다 perm(n-1) n 번. ,N 1에서 순열을 생성하는 코드를 작성하는 방법

  1. 반복 [1] 2 번, L1의 각 목록 L1 = [[1], [1]]

  2. 를 얻기 위해 0과 1의 위치에 2를 삽입 :

    예를 들어, perm(2)을 얻기 위해, 내가 할 것 [[1,2], [2,1]]이됩니다.

그럼 대답을 얻습니다.

는 그러나 나는 질문이 :

  1. 내가 use [1] * 2 나는 얕은 사본을 얻을 것이다 만약 내가는 [1]n=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
[[1] for i in xrange(2)] 

. 기존 목록에 대한 참조 만 추가하는 대신 새 목록을 만듭니다.

1

당신을 위해 내장 기능이 있습니다 : itertools.permutations. 당신은 단지 다음 @ aa333 말한대로 [1]을 반복해야하는 경우

>>> 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') 
+0

고맙습니다. 내부 코드를 사용하는 것보다는 직접 코드를 작성하는 연습을하고 있습니다. – pinseng

0

, 당신은 [[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] 

[:] 당신이 목록의 분리 (얕은) 사본 각 시간을 얻을 확인합니다 :이 경우

당신이 뭔가를해야합니다.

관련 문제