2013-04-29 26 views
11

Próbuję zaimplementować algorytm w Pythonie, aby wygenerować wszystkie Permutacje na liście. Ale w mojej pętli for chcę zachować pierwotny prefiks i listę reszty nienaruszoną, dlatego próbuję utworzyć kopię tych list za pomocą newprefix i newrest, jednak przy drukowaniu zmiennej reszta przy każdej iteracji, widzę, że nawet zmienny odpoczynek jest modyfikowany! Jak utworzyć płytką kopię listy w Pythonie? Czy jest jeszcze inny problem z moją próbą logiki?Jak zrobić płytką kopię listy w Pythonie

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

Jeśli nie jest to przeznaczone dla twojego własnego wzbogacenia, prawdopodobnie powinieneś użyć itertools.permutations(). – dstromberg

Odpowiedz

27

Aby płytką kopię można pokroić listę:

newprefix = prefix[:] 

albo przekazać je do konstruktora list:

newprefix = list(prefix) 

Także myślę, że można uprościć kod trochę:

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

Twój pierwszy (krojenie) jest moim preferowanym sposobem na osiągnięcie tego. Pomyślałem tylko, że powiadomię ich również o module kopiowania. +1 – BlackVegetable

+0

@Blender Dzięki temu uproszczony kod wygląda o wiele lepiej! – KT100

+2

Zastanawiasz się - czy operacja plasterek nie jest deklaratywna? Czy nie najlepiej jest jasno deklarować, co robisz? 'copied_list = original_list [:]' nie deklaruje, że kopia występuje, podczas gdy 'copied_list = copy.copy (original_list)' jest wysoce deklaratywna. –

Powiązane problemy