2013-04-29 24 views
11

Sto cercando di implementare un algoritmo in Python per generare tutte le permutazioni di un elenco. Ma io nel mio ciclo for desidero mantenere intatti il ​​prefisso e le liste di riposo originali, e quindi sto cercando di fare una copia di quelle liste usando newprefix e newrest, comunque stampando il resto variabile ad ogni iterazione, vedo che anche il resto il resto variabile si modifica! Come posso creare una copia superficiale della lista in Python? O c'è un altro problema con la mia logica tentata?Come creare una copia superficiale di un elenco in Python

def perm(prefix, rest): 
    if len(rest) == 0: 
     print prefix 
    for i in range(len(rest)): 
     #prints in the for loop are just for debugging 
     print "rest:", rest 
     print "i=", i 
     newprefix = prefix 
     newprefix.append(rest[i]) 
     newrest = rest 
     newrest.pop(i) 
     print "old pre : ", prefix 
     print "newpre=", newprefix 
     print "newrest=", newrest 
     perm(newprefix, newrest) 


perm([], ['a','b','c']) 
+1

A meno che questo non sia per il tuo arricchimento, probabilmente dovresti usare itertools.permutations(). – dstromberg

risposta

27

Per effettuare una copia, è possibile tagliare la lista:

newprefix = prefix[:] 

O passarlo nella list costruttore:

newprefix = list(prefix) 

Inoltre, penso che si può semplificare il codice un po ':

def perm(prefix, rest): 
    print prefix, rest 

    for i in range(len(rest)): 
     perm(prefix + [rest[i]], rest[:i] + rest[i + 1:]) 

perm([], ['a','b','c']) 
+0

Il tuo primo (slicing) è il mio modo preferito per realizzare questo. Ho solo pensato di farglielo sapere anche sul modulo di copia. +1 – BlackVegetable

+0

@Blender Grazie, il codice semplificato sembra molto meglio! – KT100

+2

Mi chiedo solo: l'operazione slice non è dichiarativa? Non è meglio dichiarare chiaramente quello che stai facendo? 'copies_list = original_list [:]' non dichiara che si sta verificando una copia, mentre 'copiato_list = copy.copy (original_list)' è altamente dichiarativo. –

Problemi correlati