[PYTHON] Ändern Sie die Liste in der for-Anweisung

Zweck

Fazit

Es gibt ein subtiles Problem beim Ändern von Sequenzen in einer Kommentarschleife (dies kann nur bei veränderlichen Sequenzen geschehen, z. B. Listen). Ein interner Zähler wird verwendet, um zu verfolgen, welches Element als nächstes verwendet wird, und dieser Zähler wird bei jeder Iteration inkrementiert. Die Schleife endet, wenn dieser Zähler die Länge der Sequenz erreicht. Wenn Sie das aktuelle (oder vorherige) Element aus der Sequenz in der Suite entfernen, wird das nächste Element übersprungen (da die Position des nächsten Elements der Index des aktuellen Elements ist, das bereits verarbeitet wurde). Es wird sein. Wenn Sie ein Element in die Suite vor dem aktuellen Element in der Sequenz einfügen, wird das aktuelle Element in der nächsten Woche der Schleife erneut behandelt. Diese Spezifikationen führen zu bösen Fehlern. Dies kann vermieden werden, indem eine temporäre Kopie mit Slices der gesamten Sequenz erstellt wird.

offiziell.py


for x in a[:]:
    if x < 0: a.remove(x)

Hintergrund

Wie schreibst du das? Was soll ich machen?

Das ist fehlerhaft

Das Element von foo_list, das von der for-Anweisung gedreht wird, wurde in der Sequenz gelöscht. Dies kann verhindern, dass die Liste bis zum Ende gedreht wird.

bug.py


for i in foo_list:
  if thres >= i:
      foo_list.remove(i)

Ich möchte dies schreiben, wenn ich versuche, den Fehler zu vermeiden

Drehen Sie zuerst alle for-Anweisungen. Notieren Sie sich das Element, das Sie löschen möchten. Drehen Sie den Memod-Inhalt mit für, um ihn zu löschen.

** Problematisch **

no_good.py


memo = []
for i in range(len(foo_list)):
    if thres >= foo_list[i]:
      memo.append(foo_list[i])

for item in memo:
    foo_list.remove(item)

Sie können ordentlich schreiben, indem Sie sich auf die Formel beziehen

Erstellen Sie ein neues Listenobjekt, indem Sie den gesamten Bereich der durch die for-Anweisung angegebenen Liste aufteilen Es ist dasselbe wie "a = foo_list [:]" zu sagen, wenn Sie kopieren möchten

beautiful.py


for i in foo_list[:]:
  if thres >= i:
      foo_list.remove(i)

Übrigens, wenn Sie nur wie oben filtern möchten, ist die Einschlussnotation besser, wie von @shiracamus unten hervorgehoben. Dann werde ich die Geschichte hinzufügen, ihn wieder zu benutzen.

@shiracamus Ist es nicht schneller, eine neue Liste mit Einschlussnotation zu erstellen, als sie aus der Liste zu entfernen?

foo_list = [i for i in foo_list if thres >= i]

Recommended Posts

Ändern Sie die Liste in der for-Anweisung
[Einführung in Python] Wie verwende ich den Operator in in der for-Anweisung?
Kopieren Sie die Liste in Python
Holen Sie sich nur Unterklassenelemente in eine Liste
Python-Liste, für Anweisung, Wörterbuch
Registrieren Sie zum ersten Mal eine Aufgabe in cron
In der Liste verfügbare Methoden
Praktisch, um Matplotlib-Unterzeichnungen in for-Anweisungen zu verwenden
Drehen Sie in Python mehrere Listen mit for-Anweisung gleichzeitig
[Python / PyQ] 4. Liste zur Anweisung
Wenn Sie in der for-Anweisung plt.save möchten
Ändern Sie das Standardausgabeziel in eine Datei in Python
Hinweise zum Einbetten der Skriptsprache in Bash-Skripte
Hinweis 2 zum Einbetten der Skriptsprache in ein Bash-Skript
Holen Sie sich die Anzahl der spezifischen Elemente in der Python-Liste
So definieren Sie mehrere Variablen in einer Python for-Anweisung
So erhalten Sie den letzten (letzten) Wert in einer Liste in Python
Ermitteln Sie die Anzahl der Vorkommen für jedes Element in der Liste
Erstellen Sie eine neue Liste, indem Sie doppelte Elemente in der Liste kombinieren
[Python] Verwalten Sie Funktionen in einer Liste
Beim Erstellen einer Matrix in einer Liste
Analysieren Sie die Researchmap-API mit Python und erstellen Sie automatisch eine Word-Datei für die Leistungsliste
Geben Sie die in S3 Bucket enthaltene Schlüsselliste in eine Datei aus
Schleife Für umgekehrte Anweisung in HTML-Datei auf Django
Ändern Sie die Bash-Eingabeaufforderung zur einfachen Anzeige in eine einfache Farbe
Fügen Sie aufeinanderfolgende Werte in der Liste zusammen
Zeigen Sie eine Liste der Alphabete in Python 3 an
Finde die Daten des verrückten Turniers heraus
Nehmen Sie die logische Summe von List in Python (Zip-Funktion)
Führen Sie den Python-Interpreter im Skript aus
MongoDB mit Python zum ersten Mal
Holen Sie sich ein Zeichen für Conoha mit Python
Ruft die EDINET-Codeliste in Python ab
Ordnen Sie die Zahlen spiralförmig an
[Einführung in die Udemy Python3 + -Anwendung] 47. Verarbeiten Sie das Wörterbuch mit einer for-Anweisung
[Linux] Ein Befehl zum Abrufen einer Liste der in der Vergangenheit ausgeführten Befehle
Ich möchte eine Liste in der Reihenfolge anderer Listen sortieren
Erhalten Sie eine Liste der Ergebnisse der Parallelverarbeitung in Python mit Starmap
Ein nützlicher Hinweis, wenn Sie Python nach langer Zeit verwenden
[Python] Erstellen einer Wörterbuchtypliste, Hinzufügen / Ändern / Löschen von Elementen und Extrahieren mit einer for-Anweisung
[IOS] Ändern Sie die Anzeigezeit für jedes Bild der GIF-Animation in Pythonista3.
So übergeben Sie das Ergebnis der Ausführung eines Shell-Befehls in einer Liste in Python
CERTIFICATE_VERIFY_FAILED in Python 3.6, dem offiziellen Installationsprogramm für macOS
[Python] Holen Sie sich die Dateien mit Python in den Ordner
Japanische Textvorverarbeitung ohne Aussage in Pandas
Verwenden Sie für den Diktatschlüssel in Python etwas anderes als eine <br> Zeichenfolge
Empfangen und verarbeiten Sie n Objekte in einer Liste
[Python] Sortieren Sie die Liste von pathlib.Path in natürlicher Reihenfolge
Erstellt einen Python-Wrapper für die Qiita-API
So löschen Sie einen Taple in einer Liste (Python)
Ändern Sie die Gerätebezeichnung (Laufwerk) im vfat-Format.
Verwenden Sie den neuesten Pip in einer virtuellen Umgebung
Ändern Sie die Schriftgröße der Legende in df.plot
Ändern Sie das Standardreferenz-Repository für die Pip-Installation
Holen Sie sich den Aufrufer einer Funktion in Python
Hinweise zum Anpassen der Diktatlistenklasse
Machen Sie vorerst ein Histogramm (matplotlib)
Extrahieren Sie den Produktnamen und den Preis aus der Produktliste in der E-Mail mit der Kaufabrechnung von Yodobashi.com.
Finden Sie die Anzahl der Tage in einem Monat
Programm zur Suche nach demselben Bild