2012-05-28 88 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