2017-01-23 5 views
-1

배열의 모든 가능한 순열에 대한 함수를 만들고 싶습니다. 나는 약간의 코드를 작성했는데, 무엇이 잘못되었는지를 모른다. 그것은 첫 번째 가능성 = [1,2,3]을 반환하지만, 그것은 오류로 실패합니다 : 원본 [i] 인덱스가 빠졌지 만 원본과 동일해야합니다. [1]은 2와 같습니다. 나에게 의미가 없다.순열 in Python - 템플릿

진심으로 감사드립니다.

array = [1,2,3] 
out = [] 

def permutacja(original,perm): 
    if(len(original) == 0): 
     print(perm) 
     return perm 

    temp = original 
    for i in range(0,len(original)): 
     perm.append(original[i]) 
     del temp[0] 
     permutacja(temp,perm) 
     del perm[len(perm)-1] 

permutacja(array,out) 
+0

네, 온도는 원래 에서도 삭제합니다'TMP는 = 배열을 사용한다 insdead을 list'에 대한 참조를 #copies : 'tmp = list (array)' –

답변

4

파이썬 표준 라이브러리 모듈 itertools은 순열을 산출하는 itertools.permutations을 제공

>>> import itertools 
>>> for xs in itertools.permutations([1,2,3]): 
...  print(xs) 
... 
(1, 2, 3) 
(1, 3, 2) 
(2, 1, 3) 
(2, 3, 1) 
(3, 1, 2) 
(3, 2, 1) 
+0

고맙지 만, 다른 유형의 데이터를 포함하는 더 복잡한 알고리즘을 위해 이것을 필요로한다.이 알고리즘을 내 알고리즘에 연루시키는 간단한 방법을 이해해야한다. – user3541098

+1

@ user3541098, 알았어. , 너에게 너의 imp에 대한 힌트를 줄게. 완화 문제. 'temp = original'을 실행함으로써,'temp'는 같은 목록을 참조합니다 (복사하지 않음). 'temp = original [:]'을 실행하면 복사본을 얻을 수 있습니다. – falsetru

+0

@ user3541098 :'itertools'는 문자열, 정수, 부동 소수점, 객체 등 모든 종류의 데이터와 함께 작동합니다. –

0

당신은 더 나은이 아니라 최적화 및 테스트 루틴 때문에 이것에 대한 itertools를 사용합니다. 당신이 그것을 직접 구현하려는 경우에는 그럼에도 불구하고, 수정을 개선 할 수있는 몇 가지 /가 있습니다 :

  • 당신에게 return 값,하지만 당신은 필요 마지막 재귀 단계에서 다시을 전파;
  • 참조을 즉시 작성한 목록에 반환하면 결과적으로 항상 동일한 목록이 반환됩니다.
  • 항상 del입니다. 첫 번째 요소이 아닙니다.
  • 삭제 후 요소을 복원하지 못합니다.
def permutacja(original,perm): 
    if(len(original) == 0): 
     print(perm) 
     yield perm.copy() # emit instead of return for proagation 
    else: 
     temp = original 
     for i in range(0,len(original)): 
      perm.append(original[i]) 
      temp = original[:i]+original[i+1:] #remove the i-th 
      for result in permutacja(temp,perm): 
       yield result # propagate back 
      del perm[len(perm)-1] 
      # because we copy original, no need to restore 

일부위한 추가적인 개선 사항 : 마지막 요소에

  • 사용 .pop() 대신 del; 및
  • 당신은 단순히 len(..) 대신 비교의 if original을 사용할 수 있습니다 :
def permutacja(original,perm): 
    if original: 
     print(perm) 
     yield perm.copy() 
    else: 
     temp = original 
     for i in range(0,len(original)): 
      perm.append(original[i]) 
      temp = original[:i]+original[i+1:] #remove the i-th 
      for result in permutacja(temp,perm): 
       yield result # propagate back 
      perm.pop() 
      # because we copy original, no need to restore