2010-01-12 18 views
5

Ich versuche, alle möglichen Permutationen von einer Liste von Zahlen angezeigt werden, zum Beispiel, wenn ich 334 habe ich möchte bekommen:Python erhalten alle Permutationen von Zahlen

3 3 4 
3 4 3 
4 3 3 

Ich muss das tun können, für jeden Satz von Ziffern mit einer Länge von bis zu 12 Ziffern.

Ich bin sicher, es ist wahrscheinlich ziemlich einfach mit etwas wie itertools.combinations, aber ich kann nicht ganz die Syntax richtig.

TIA Sam

Antwort

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

+1, verschiedene Permutationen von einer Liste. 'set (list())' zur Rettung wieder. – Seth

+0

perfekt thx :-) –

2

Sie wollen Permutationen, nicht Kombinationen. Siehe: 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)] 

Beachten Sie, dass es Permutation die zwei 3s (das ist die richtige Sache ist, mathematisch zu tun), aber es ist nicht das gleiche wie Ihr Beispiel. Dies wird nur einen Unterschied machen, wenn in Ihrer Liste doppelte Nummern vorhanden sind.

3

ohne 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 

Ausgang

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

ich Python verwenden würde itertools, aber wenn Sie diese selbst zu implementieren hatte, ist hier Code, der alle Permutationen einer bestimmten Größe zurückgibt für eine Liste von Werten.

Beispiel: 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

Das ist eine coole Antwort, die ich mochte, aber es könnte gut sein, wenn Werte auch Null unterstützt. Bsp .: Werte = [0,1,2] Diese Logik schlägt fehl. :) – Haranadh

Verwandte Themen