Problem mit 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
djangofish
User
Beiträge: 51
Registriert: Dienstag 16. Oktober 2012, 09:43
Kontaktdaten:

Ich möchte einen Eintrag der in 'listB' gepeichert ist, mehrmals kopieren und an eine andere Liste anfügen. Für jeden Code aus 'codeList' soll eine Zeile erstellt und dabei der Code in eine Spalte geschrieben werden.
Leider haben alle alle erstellten Einträge mit den selben Code in der Spalte, nämlich den letzten "BC6". Woran liegt es?

Hier die Schleife:

Code: Alles auswählen

codeList = ['BA3','BB9','BC6']
for l in listB:
    if l[23]:
        for code in codeList:
            l[6] = '+P' + code
            listA.append(l)

Vielen Dank
Peter
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Naja, du überschreibst die Spalte in `l[6]` (also exakt die selbe Stelle) halt nacheinander mit allen Werten aus `codeList`. Übrig bleibt dementsprechend der letzte Wert. Und den bekommst du angezeigt.

Python fügt nicht selbständig mehrere Werte hintereinander, wenn man die selbe Stelle mehrmals beschreibt, sondern der vorherige Wert wird durch den neuen Wert sozusagen stillschweigend ersetzt.

Um das nochmal anders zu sagen: Deine innere Schleife arbeitet durchgehend mit dem `l`, welches durch die äußere Schleife im jeweils aktuellen Iterationsschritt definiert wird. Im vorliegenden Beispiel wird also in der inneren Schleife dreimal irgendwas mit dem aktuellen `l` gemacht, dann folgt der nächste Iterationsschritt der äußeren Schleife, welcher ein neues `l` definiert und dieses neue `l` wird wiederum von der inneren Schleife dreimal benutzt, dann definiert die äußere Schleife wieder einen neuen Wert für `l`, etc...
Zuletzt geändert von snafu am Donnerstag 9. Mai 2013, 20:51, insgesamt 1-mal geändert.
BlackJack

@djangofish: Und an `listA` hängst Du potentiell *mehrfach* die *selbe* Liste an, die gerade an `l` gebunden ist. Auch an der Stelle wird nicht auf magische Weise eine Kopie erstellt.
djangofish
User
Beiträge: 51
Registriert: Dienstag 16. Oktober 2012, 09:43
Kontaktdaten:

Ich komm nicht auf die Lösung. Wie wäre es denn nun richtig?
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Wenn ich dein Vorhaben richtig verstehe, dann musst du in der inneren `for`-Schleife eine Kopie von `l` erstellen, in dieser Kopie am gewünschten Indexwert den im jeweiligen Durchlauf aktuellen `code` reinschrieben und die Kopie dann an deine andere Liste dranhängen.

Kopieren geht entweder mittels Übergabe der zu kopierenden Liste an `list()` oder mittels Slicing (`l[:]`). Falls dir das Probleme bereitet, solltest du ggf mal das offizielle Python-Tutorial durcharbeiten.
djangofish
User
Beiträge: 51
Registriert: Dienstag 16. Oktober 2012, 09:43
Kontaktdaten:

Danke!
So gehts wohl. Wieder was gelernt.... copy quasi:)

Code: Alles auswählen

for l in listB:
    if l[23]:
        for code in codeList:
            la = copy.copy(l)
            la[6] = '+P' + code
            listA.append(la) 
Antworten