Iteration durch Listen
Verfasst: Sonntag 8. Februar 2009, 21:36
Hallo, ich habe so meine Probleme mit der Iteration durch Listen, und einmal ein Minimalbeispiel dazu geschrieben. Dieses Beispiel tut nicht dies, was ich von ihm erwarten würde, warum nicht?
Gegeben:
Ich habe das Gefühl, dass es wohl irgend etwas mit dem Entfernen von Elementen aus einer Liste zu tun haben könnte. Lasse ich diesen Teil des Codes weg, funktioniert erst mal alles, wie ich es mir denke. Es wird dann natürlich aber die Liste nicht bereinigt. 
Auf den Gedanken, die zu löschenden Elemente nicht gleich zu entfernen, bin ich auch erst gekommen, als ich merkte, dass Python dann offensichtlich Probleme mit dem Konstrukt "for i in list" hat, wenn während dieser Schleife aus list gelöscht wird.
Für jede Erklärung dankbar
Gruß weasel
Gegeben:
- eine Liste mit Inhalt mehrerer anderer Listen, also eine list of lists
eine liste von dictonarys, welche wiederum eine Liste enthalten
- Die Listen aus dem Dictonary sollen zulässige Zahlenwerte darstellen. Alle anderen Zahlenwerte, welche in der Liste mit Listen erscheinen, sollen daraus entfernt werden, und jeweils als temporär bereinigte Kopie der Liste ausgegeben werden.
- Das erste Durchsuchen, Bereinigen und Ausgeben der Listenkopie funktioniert. Beim zweiten Durchgang jedoch scheint der Code nicht mehr eine Kopie der Ausgangsliste zu erzeugen, sondern greift auf die Liste aus dem vorherigen Durchlauf zurück
Code: Alles auswählen
#!/usr/bin/python
check = [{"numbers":[2,3]},{"numbers":[2,5]}]
listoflists = [[1,2,3,4,5],
[2,3,4,5,6],
[3,4,5,6,7],
[4,5,6,7,8],
[5,6,7,8,9]]
# listoflists sollte in meinem Beispiel eigentlich 2 mal durchlaufen werden.
# Einmal sollten alle Zahlen ungleich 2 und 3 entfernt werden, die bereinigte
# Kopie ausgegeben werden, und danach ein zweiter Durchlauf gestartet werden,
# welcher alle Zahlen ungleich 2 und 5 entfernt.
for i in check:
tmplistoflists = listoflists[:]
for tmplist in tmplistoflists:
removelist = []
for number in tmplist:
if number not in i['numbers']:
removelist.append(number)
for number in removelist:
tmplist.remove(number)
print "tl: ",tmplist
print "check next"

Auf den Gedanken, die zu löschenden Elemente nicht gleich zu entfernen, bin ich auch erst gekommen, als ich merkte, dass Python dann offensichtlich Probleme mit dem Konstrukt "for i in list" hat, wenn während dieser Schleife aus list gelöscht wird.
Für jede Erklärung dankbar
Gruß weasel