Seite 1 von 1

Problem mit Variablenzuweisung und Listen

Verfasst: Donnerstag 31. Mai 2007, 16:59
von _johannes
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

Verfasst: Donnerstag 31. Mai 2007, 17:21
von 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.

Verfasst: Donnerstag 31. Mai 2007, 19:13
von _johannes
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?

Verfasst: Donnerstag 31. Mai 2007, 19:28
von 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.

Verfasst: Freitag 1. Juni 2007, 15:38
von _johannes
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