2017-01-23 61 views
-1

我想爲每個可能的數組排列創建函數。我寫了一些代碼,我不知道它有什麼問題。它返回我第一個可能性= [1,2,3],但然後它失敗,錯誤:original [i]超出索引,但它應該是原始[1]等於2.也許刪除溫度也從原始擦除,但會對我來說沒有意義。Python中的排列 - 模板

謝謝advace。

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 =陣列#copies提及list' insdead應該使用: 其中包括不同類型的數據'TMP =列表(陣列)' –

回答

4

Python標準庫模塊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 ete the 第一個元素,不是你選的那個;和
  • 你做不還原刪除後的元素。
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