2010-01-12 18 views
5

che sto cercando di visualizzare tutte le possibili permutazioni di una lista di numeri, per esempio se ho 334 che voglio ottenere:Python ottenere tutte le permutazioni dei numeri

3 3 4 
3 4 3 
4 3 3 

Ho bisogno di essere in grado di farlo per qualsiasi serie di cifre lunghe fino a 12 cifre.

Sono sicuro che probabilmente è abbastanza semplice utilizzando qualcosa come itertools.combinations ma non riesco a ottenere la sintassi giusta.

TIA Sam

risposta

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

+1, permutazioni distinte di un elenco. 'set (list())' per il salvataggio di nuovo. – Seth

+0

perfect thx :-) –

2

Volete permutazioni, non combinazioni. Vedere: 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)] 

Nota che è permutando la due 3 (che è la cosa giusta da fare matematicamente), ma non è lo stesso del vostro esempio. Questo farà la differenza solo se ci sono numeri duplicati nella tua lista.

3

senza 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 

uscita

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

userei pitone di itertools, ma se si dovesse implementare da soli, ecco il codice che restituisce tutte le permutazioni di una dimensione specificata per un elenco di valori.

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

Questa è una bella risposta, mi è piaciuta, ma potrebbe essere utile se anche i valori supportano zero. Es: valori = [0,1,2] questa logica sta fallendo. :) – Haranadh

Problemi correlati