2012-05-28 127 views

回答

3

itertools.permutations這是否適合你。否則,一個簡單的方法就是遞歸地查找排列:您先後選擇輸出的第一個元素,然後讓您的函數查找其餘元素的所有排列。

略有不同,但類似的解決方案可在https://stackoverflow.com/a/104436/42973找到。它查找剩餘(非第一個)元素的所有排列,然後在所有可能的位置連續插入第一個元素。

-1

這是一個基本的解決方案... 這個想法是使用遞歸遍歷所有的排列並拒絕非有效的排列。

def perm(list_to_perm,perm_l,items,out): 
     if len(perm_l) == items: 
      out +=[perm_l] 
     else: 
      for i in list_to_perm: 
       if i not in perm_l: 
        perm(list_to_perm,perm_l +[i],items,out) 


a = [1,2,3] 
out = [] 
perm(a,[],len(a),out) 
print out 

輸出:

[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]] 
+0

這是非常複雜(長而不是非常清晰)。例如http://stackoverflow.com/a/104436/42973可以找到更簡單的解決方案。 – EOL

+0

@EOL不認爲您的解決方案拒絕部分解決方案,最終會成爲重複項(回溯)。所以額外的「複雜性」給你提供了更好的速度。 – fhtuft

+0

感謝您的反饋。我不確定我是否理解這個重複的問題。您是指輸入列表包含相同元素的情況?與[0,0,1]一樣,其置換包括[0,0,1]兩次?請注意,包括它兩次是很自然的;這是itertools.permutations()和我鏈接的解決方案所做的。 – EOL