2010-01-12 45 views
5

我試圖顯示數字列表的所有可能的排列的所有排列,例如,如果我有334我想:Python中得到的數字

3 3 4 
3 4 3 
4 3 3 

我需要能夠做到這一點對於長達約12位數字的任何一組數字。

我敢肯定,它可能相當簡單,使用itertools.combinations類似的東西,但我不能完全得到正確的語法。

TIA 山姆

回答

24
>>> lst = [3, 3, 4] 
>>> import itertools 
>>> set(itertools.permutations(lst)) 
{(3, 4, 3), (3, 3, 4), (4, 3, 3)} 
+0

1,列表的不同排列。再次設置(list())'來拯救。 – Seth 2010-01-12 22:43:00

+0

完美thx :-) – 2010-01-12 22:43:09

2

你想要排列,而不是組合。請參閱:How to generate all permutations of a list in Python

>>> from itertools import permutations 
>>> [a for a in permutations([3,3,4])] 
[(3, 3, 4), (3, 4, 3), (3, 3, 4), (3, 4, 3), (4, 3, 3), (4, 3, 3)] 

注意,它的置換兩個3的(在數學上做正確的事),但不一樣的你的榜樣。如果列表中有重複的號碼,這隻會有所作爲。

3

沒有itertools

def permute(LIST): 
    length=len(LIST) 
    if length <= 1: 
     yield LIST 
    else: 
     for n in range(0,length): 
      for end in permute(LIST[:n] + LIST[n+1:]): 
       yield [ LIST[n] ] + end 

for x in permute(["3","3","4"]): 
    print x 

輸出

$ ./python.py 
['3', '3', '4'] 
['3', '4', '3'] 
['3', '3', '4'] 
['3', '4', '3'] 
['4', '3', '3'] 
['4', '3', '3'] 
1

我會使用Python的itertools,但如果你有這自己實現,這裏有一個返回指定大小的所有排列碼獲取值的列表。

示例:values = [1,2,3]size = 2 =>[[3, 2], [2, 3], [2, 1], [3, 1], [1, 3], [1, 2]]

def permutate(values, size): 
    return map(lambda p: [values[i] for i in p], permutate_positions(len(values), size)) 

def permutate_positions(n, size): 
    if (n==1): 
    return [[n]] 

    unique = [] 
    for p in map(lambda perm: perm[:size], [ p[:i-1] + [n-1] + p[i-1:] for p in permutate_positions(n-1, size) for i in range(1, n+1) ]): 
    if p not in unique: 
     unique.append(p) 

    return unique 
+0

這是一個很酷的答案,我喜歡,但它也可能是好的,如果值也支持零。例如:值= [0,1,2]該邏輯失敗。 :) – Haranadh 2017-03-02 12:52:12