Jetzt weiß ich, dass es nicht sicher ist, die Liste während einer iterativen Schleife zu ändern. Angenommen, ich habe eine Liste von Zeichenfolgen und möchte die Zeichenfolgen selbst entfernen. Zählt das Ersetzen veränderlicher Werte als Änderung?
178
Antworten:
Es wird als schlechte Form angesehen. Verwenden Sie stattdessen ein Listenverständnis mit Slice-Zuweisung, wenn Sie vorhandene Verweise auf die Liste beibehalten müssen.
quelle
print b
Anweisung ausgeführt wird, können Sie feststellen, ob siea
an Ort und Stelle geändert und nicht ersetzt wurde. Eine andere Möglichkeit wäre gewesen,print b is a
zu sehen, ob sich beide immer noch auf dasselbe Objekt beziehen.Da die folgende Schleife nur bereits gesehene Elemente ändert, wird dies als akzeptabel angesehen:
Welches unterscheidet sich von:
, dass keine temporäre Liste erstellt und zugewiesen werden muss, um das Original zu ersetzen, obwohl mehr Indizierungsvorgänge erforderlich sind.
Achtung: Obwohl Sie Einträge auf diese Weise ändern können, können Sie die Anzahl der Elemente in der nicht ändern,
list
ohne das Risiko von Problemen zu riskieren.Hier ist ein Beispiel dafür, was ich meine - das Löschen eines Eintrags bringt die Indizierung von diesem Punkt an durcheinander:
(Das Ergebnis ist falsch, da nicht alle Elemente gelöscht wurden, die es haben sollte.)
Aktualisieren
Da dies eine ziemlich beliebte Antwort ist, können Sie Einträge wie folgt effektiv "an Ort und Stelle" löschen (auch wenn dies nicht genau die Frage ist):
quelle
for i in a
? Dies ist sehr eingängig, scheint sich von anderen Sprachen zu unterscheiden und hat zu Fehlern in meinem Code geführt, die ich über einen langen Zeitraum debuggen musste. Python Tutorial erwähnt es nicht einmal. Obwohl es einen Grund dafür geben muss?a[i]
unds
) für dasselbe Objekt in derselben Zeile verwenden, wenn Sie nicht müssen? Ich würde es viel lieber tuna[i] = a[i].strip()
.a[i] = s.strip()
nur eine Indizierungsoperation ausgeführt wird.enumerate(b)
führt bei jeder Iteration eine Indizierungsoperation durch, mit der Sie eine weitere ausführena[i] =
. AFAIK es ist unmöglich, diese Schleife in Python mit nur 1 Indizierungsoperation pro Schleifeniteration zu implementieren :(Eine für die Schleifenvariante sieht für mich sauberer aus als eine mit enumerate ():
quelle
range(len(list))
Python für einen Codegeruch.enumerate
es sich um einen Generator handelt, wird keine Liste von Tupeln erstellt. Sie werden einzeln erstellt, während die Liste durchlaufen wird. Der einzige Weg zu erkennen, was langsamer ist, wäre zutimeit
.timeit
enumerate
ist langsamerDas Ändern jedes Elements während der Iteration einer Liste ist in Ordnung, solange Sie das Hinzufügen / Entfernen von Elementen zur Liste nicht ändern.
Sie können das Listenverständnis verwenden:
oder machen Sie einfach die
C-style
for-Schleife:quelle
Nein, Sie würden den "Inhalt" der Liste nicht ändern, wenn Sie Zeichenfolgen auf diese Weise mutieren könnten. Aber in Python sind sie nicht veränderlich. Jede Zeichenfolgenoperation gibt eine neue Zeichenfolge zurück.
Wenn Sie eine Liste von Objekten hatten, von denen Sie wussten, dass sie veränderbar sind, können Sie dies tun, solange Sie den tatsächlichen Inhalt der Liste nicht ändern.
Daher müssen Sie eine Karte erstellen. Wenn Sie einen Generatorausdruck verwenden, wird dieser [Vorgang] beim Iterieren ausgeführt und Sie sparen Speicherplatz.
quelle
Sie können so etwas tun:
Es wird als Listenverständnis bezeichnet, um Ihnen das Durchlaufen einer Liste zu erleichtern.
quelle
Die Antwort von Jemshit Iskenderov und Ignacio Vazquez-Abrams ist wirklich gut. Dies lässt sich anhand dieses Beispiels weiter veranschaulichen: Stellen Sie sich das vor
a) Sie erhalten eine Liste mit zwei Vektoren.
b) Sie möchten die Liste durchlaufen und die Reihenfolge der einzelnen Arrays umkehren
Nehmen wir an, Sie haben
Sie erhalten
Auf der anderen Seite, wenn Sie dies tun
Das Ergebnis ist
quelle
Aus Ihrer Frage geht nicht hervor, nach welchen Kriterien entschieden werden soll, welche Zeichenfolgen entfernt werden sollen. Wenn Sie jedoch eine Liste der Zeichenfolgen haben oder erstellen können, die Sie entfernen möchten, können Sie Folgendes tun:
was my_strings in ['a', 'c', 'e'] ändert
quelle
Kurz gesagt, um Änderungen an der Liste vorzunehmen, während dieselbe Liste wiederholt wird.
Beispiel:
quelle