Problem mit Variablenzuweisung und Listen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
_johannes
User
Beiträge: 20
Registriert: Montag 19. Juni 2006, 17:37

Hallo,

Ich habe folgendes kleine Skript geschrieben:

Code: Alles auswählen

list1 = [[[1, 2, 3],[4, 5, 6],[7, 8, 9]]]
list2 = [[10,20,30],[10,21,30],[40,50,60],[40,51,60],[70,80,90],[70,81,90]]

erg = []
for i in list1 [0][1]:
	erg.append(i+(list2 [0][1]))
print erg

list3 = list2[:]

erg2 = []
for j in erg:
	list3 [0][1]= j
	print list3
	erg2.append(list3)

print erg2
Mit folgendem Ergebnis:
[[10, 24, 30], [10, 21, 30], [40, 50, 60], [40, 51, 60], [70, 80, 90], [70, 81, 90]]
[[10, 25, 30], [10, 21, 30], [40, 50, 60], [40, 51, 60], [70, 80, 90], [70, 81, 90]]
[[10, 26, 30], [10, 21, 30], [40, 50, 60], [40, 51, 60], [70, 80, 90], [70, 81, 90]]

[[[10, 26, 30], [10, 21, 30], [40, 50, 60], [40, 51, 60], [70, 80, 90], [70, 81, 90]], [[10, 26, 30], [10, 21, 30], [40, 50, 60], [40, 51, 60], [70, 80, 90], [70, 81, 90]], [[10, 26, 30], [10, 21, 30], [40, 50, 60], [40, 51, 60], [70, 80, 90], [70, 81, 90]]]

Das Problem ist, dass ich eigentlich das was "print3" ausgibt, also 10,24,… 10,25… und 10,26… gerne zusammen in einer umschließenden Liste (erg2) hätte.
Aber das passiert nun gerade nicht ich habe in erg2 immer nur das letzte Ergebnis der Schleife, das aber 3mal.
Wo liegt denn hier mein Fehler? Ich schau mir das jetzt schon Stunden an und kapiere es nicht. Wie mach' ich's richtig?

Grüße,
_johannes
BlackJack

In der zweiten ``for``-Schleife änderst Du immer die *selbe* Liste und hängst sie an `erg2` an. Mach am Ende mal ein:

Code: Alles auswählen

print map(id, erg2)
Da sollte dreimal die gleiche ID bei herauskommen.
Benutzeravatar
_johannes
User
Beiträge: 20
Registriert: Montag 19. Juni 2006, 17:37

Ah.
Ja, genau dieser Befehl ergibt:
[454096, 454096, 454096]
Nur, wie kriege ich dann das hin, was ich will. Mit dieser Schleife geht das dann wohl nicht.
Muss ich ein ganz anderes Schleifenkonstrukt bauen?
BlackJack

Du wirst die Liste in der Schleife kopieren müssen und nicht einmal vor der Schleife. Und zwar eine tiefe Kopie. Schau mal in's `copy`-Modul.
Benutzeravatar
_johannes
User
Beiträge: 20
Registriert: Montag 19. Juni 2006, 17:37

Ja, danke, das klappt.

Für andere Newbies wie mich poste ich mal meine funktionierende Lösung:

Code: Alles auswählen

import copy

list1 = [[[1, 2, 3],[4, 5, 6],[7, 8, 9]]]
list2 = [[10,20,30],[10,21,30],[40,50,60],[40,51,60],[70,80,90],[70,81,90]]

erg = []
for i in list1 [0][1]:
	erg.append(i+(list2 [0][1]))

erg2 = []
for j in erg:
	list3 = copy.deepcopy(list2)
	list3 [0][1]= j
	erg2.append(list3)

print erg2
Grüße,
_johannes
Antworten