In der Liste müssen mehrere Elemente gelöscht werden. Wenn ich sie während einer Schleife löschte, ohne an etwas zu denken, fand ich ein Element, das den Bedingungen entspricht, aber nicht gelöscht wird.
Es war sehr einfach, und ich habe es vom Anfang der Liste gescannt und gelöscht, sodass die Kombination aus Index und Element merkwürdig wurde und das ursprünglich gelöschte Element erhalten blieb.
Geändert, um die Liste in umgekehrter Reihenfolge zu scannen
lst = [1, 2, 3]
for i in lst:
if i in (1, 2):
lst.remove(i)
print(lst)
#Ausführungsergebnis
[2, 3]
lst = [1, 2, 3]
for I in reversed(lst):
if i in (1, 2):
lst.remove(i)
print(lst)
#Ausführungsergebnis
[3]
Wenn Sie es oben in der Liste löschen, werden die Elemente gepackt, der Index bleibt jedoch unverändert. Daher wird das nächste gelöschte Element gepackt und nicht verarbeitet. Durch Löschen der Liste von hinten wird verhindert, dass das nächste zu beurteilende Element gepackt wird.
>>> lst = [1, 2, 3]
>>> for i, l in enumerate(lst):
... print("index:%s, value:%s, list:%s" % (i, l, lst))
... if l in (1, 2):
... lst.remove(l)
... print("index:%s, value:%s, list:%s" % (i, l, lst))
...
index:0, value:1, list:[1, 2, 3]
index:0, value:1, list:[2, 3]
index:1, value:3, list:[2, 3]
index:1, value:3, list:[2, 3]
Da der Wert "3" ist, wenn der Index "1" ist, wird "2", das durch das Urteil entfernt werden sollte, nicht verarbeitet. (Wenn der Index "1" ist, ist der Wert gemäß der ursprünglichen Liste "2".) Tun Sie dies in umgekehrter Reihenfolge.
>>> lst = [1, 2, 3]
>>> for i, l in enumerate(reversed(lst)):
... print("index:%s, value:%s, list:%s" % (i, l, lst))
... if l in (1, 2):
... lst.remove(l)
... print("index:%s, value:%s, list:%s" % (i, l, lst))
...
index:0, value:3, list:[1, 2, 3]
index:0, value:3, list:[1, 2, 3]
index:1, value:2, list:[1, 2, 3]
index:1, value:2, list:[1, 3]
index:2, value:1, list:[1, 3]
index:2, value:1, list:[3]
Bis zu diesem Punkt beim Löschen mit ** Element **. Eine Sache, auf die Sie achten sollten, ist das Löschen mit ** index **. Beim Löschen mit ** index ** führt diese Schreibmethode zu einem Fehler.
>>> lst = [1, 2, 3]
>>> for i, l in enumerate(reversed(lst)):
... print("index:%s, value:%s, list:%s" % (i, l, lst))
... if l in (1, 2):
... del lst[i]
... print("index:%s, value:%s, list:%s" % (i, l, lst))
...
index:0, value:3, list:[1, 2, 3]
index:0, value:3, list:[1, 2, 3]
index:1, value:2, list:[1, 2, 3]
index:1, value:2, list:[1, 3]
index:2, value:1, list:[1, 3]
Traceback (most recent call last):
File "<stdin>", line 4, in <module>
IndexError: list assignment index out of range
In diesem Fall kann dies wie folgt behandelt werden.
>>> lst = [1, 2, 3]
>>> for i, l in reversed(list(enumerate(lst))):
... print("index:%s, value:%s, list:%s" % (i, l, lst))
... if l in (1, 2):
... del lst[i]
... print("index:%s, value:%s, list:%s" % (i, l, lst))
...
index:2, value:3, list:[1, 2, 3]
index:2, value:3, list:[1, 2, 3]
index:1, value:2, list:[1, 2, 3]
index:1, value:2, list:[1, 3]
index:0, value:1, list:[1, 3]
index:0, value:1, list:[3]
Recommended Posts