[PYTHON] Zu beachtende Punkte beim Löschen mehrerer Elemente aus der Liste

Was ist passiert

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.

Ursache

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.

Problemumgehung

Geändert, um die Liste in umgekehrter Reihenfolge zu scannen

Vor dem Umgang

lst = [1, 2, 3]
for i in lst:
    if i in (1, 2):
        lst.remove(i)
print(lst)
#Ausführungsergebnis
[2, 3]

Nach dem Umgang

lst = [1, 2, 3]
for I in reversed(lst):
    if i in (1, 2):
        lst.remove(i)
print(lst)
#Ausführungsergebnis
[3]

Kommentar

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.

Überprüfung

Vor der Korrespondenz

>>> 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.

Nach der Korrespondenz

>>> 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]

Dinge, auf die Sie achten sollten

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

Zu beachtende Punkte beim Löschen mehrerer Elemente aus der Liste
Zu beachtende Punkte beim Wechsel von NAOqi OS 2.4.3 zu 2.5.5
[Python] Lösung für das Problem, dass Elemente beim Kopieren einer Liste verknüpft werden
Vorsichtsmaßnahmen bei der Durchführung einer logistischen Regression mit Statsmodels
Beachten Sie beim Initialisieren einer Liste in Python
Farbpunkte entsprechend dem Abstand von der Regressionskurve
(Hinweis) Punkte, auf die Sie bei der Installation von Scilab unter ArchLinux achten sollten
Extrahieren Sie den Wert, der einem Wert am nächsten kommt, aus einem Listenelement in Python
Zu beachtende Punkte, wenn Pandas CSV der Excel-Ausgabe lesen
Vorsichtsmaßnahmen beim Ausführen von Python unter EC2 über AWS Lambda (Befehl ausführen)
Wenn Sie eine mehrdimensionale Liste nach mehreren Zeilen sortieren möchten
Im Python-Befehl zeigt Python auf Python3.8
Löschen Sie mehrere Elemente in der Python-Liste
Erweiterung von Python um C oder C ++ (wenn es mehrere Argumente gibt, wenn eine Liste von der Python-Seite übergeben wird)
Entfernen oder Abrufen von Arrays aus Fasta gemäß der ID-Listendatei
Python Hinweis: Wenn Sie die Attribute eines Objekts kennen möchten
Übergeben Sie beim Ausführen einer Python-Shell von Electron mehrere Argumente, um Python auszuführen.
Zu berücksichtigende Punkte, wenn Sie die SoftLayer-API über eine App auf Bluemix aufrufen
[Hinweis] [PyTorch] Von der Installation bis zur einfachen Verwendung
Verwendung von Multi-Core aus der Sicht mehrerer Sprachen
So bedienen Sie Linux von der Konsole aus
Python Amateur versucht die Liste zusammenzufassen ①
Listenelemente ohne '' verbinden. (String aus der Liste ohne '' abrufen)
So greifen Sie von außen auf den Datenspeicher zu
DJango Hinweis: Von Anfang an (Formularverarbeitung)
[Python-Tipps] So rufen Sie mehrere Schlüssel mit dem Maximalwert aus dem Wörterbuch ab