2012-04-13 7 views
0

Ich versuche, eine Liste von 4 Elementen iterativ mischen, dann fügen Sie die gemischt Liste auf eine wachsende Liste. Das Ergebnis wird eine Liste sein, die ein Vielfaches von 4 Elementen lang ist, wobei alle vier Elemente eine Kombination aus meiner ursprünglichen Liste sind.Iterative grow eine gemischte Liste in Python

Mein Code ist

import random 
list1 = ['X','Y','Z','Q'] 
list2 = [] 
for drop in range(0,72/4): 
    random.shuffle(list1) 
    list2.append(list1) 

Das Problem, das ich zu haben scheinen, ist, dass list2 wird die gleiche Shuffled Version von list1 immer und immer sein.

Beispiel list2: ['Q', 'X', Z ',' Y ',' Q ',' X ', Z', 'Y', 'Q', 'X', Z ',' Y‘, ...]

Antwort

5

ich glaube, Sie

list2.extend(list1) 

Ansonsten schreiben wollte, würden Sie die gleiche Instanz des Objekts list1 fügen immer und immer wieder list2.

+0

Gibt es einen Grund, warum list2.append (list1) dieselbe Instanz immer wieder hinzufügt? Meine Logik war, dass list1 während jeder Schleife neu geordnet würde. –

+1

Beachten Sie zuerst, dass Sie mit 'list2.append (list1)' 'die Elemente von list1 nicht zu list2 hinzufügen. Sie fügen list1 selbst zu list2 hinzu (['X', 'Y', 'Z', 'Q'] gegen [['X', 'Y', 'Z', 'Q']]). Da keine Kopie von list1 erstellt wird, ändert 'random.shuffle (list1)' alle Vorkommen von list1 in list2. – user1202136

0

Wenn Sie list1 an Ort und Stelle mischen, mischen Sie alle Instanzen von list1. Wenn Sie list1 an list2 anhängen, mischen Sie die gleiche Liste immer und immer wieder.

Try deepcopy

import random, copy 
list1 = [1,2,3,4] 
list2 = [] 
for i in xrange(10): 
    random.shuffle(list1) 
    list2.append(copy.deepcopy(list1)) 
+1

Vielleicht ist 'copy.deepcopy()' hier ein bisschen zu viel. Eine einfache 'list1 [:]' würde den Trick machen. –

2

Wenn Sie eine Liste in eine andere Liste anhängen, sind Sie nicht eine Kopie dieser Liste machen mit - Sie Anfügen einen anderen Verweis auf die ursprüngliche Liste. Alle Ihre Anfügeversuche sind wirklich Verweise auf dasselbe Objekt, und eine Änderung an einem ist eine Modifikation für alle.

Hier ist eine Demonstration dieses überraschenden Ergebnisses.

>>> list1 = ['X', 'Y', 'Z', 'Q'] 
>>> list2 = [] 
>>> list2.append(list1) 
>>> list2.append(list1) 
>>> list2 
[['X', 'Y', 'Z', 'Q'], ['X', 'Y', 'Z', 'Q']] 
>>> list2[0][0] = 'A' 
>>> list2 
[['A', 'Y', 'Z', 'Q'], ['A', 'Y', 'Z', 'Q']] 
>>> list1[0] = 'B' 
>>> list2 
[['B', 'Y', 'Z', 'Q'], ['B', 'Y', 'Z', 'Q']]