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.
Benutzeravatar
_johannes
User
Beiträge: 20
Registriert: Montag 19. Juni 2006, 17:37

Problem mit Variablenzuweisung und Listen

Beitragvon _johannes » Donnerstag 31. Mai 2007, 16:59

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

Beitragvon BlackJack » Donnerstag 31. Mai 2007, 17:21

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

Beitragvon _johannes » Donnerstag 31. Mai 2007, 19:13

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

Beitragvon BlackJack » Donnerstag 31. Mai 2007, 19:28

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

Beitragvon _johannes » Freitag 1. Juni 2007, 15:38

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

Wer ist online?

Mitglieder in diesem Forum: jan.b