Ich habe alle anderen Fragen mit demselben Fehler überprüft, aber keine hilfreiche Lösung gefunden = /
Ich habe ein Wörterbuch mit Listen:
d = {'a': [1], 'b': [1, 2], 'c': [], 'd':[]}
in dem einige der Werte leer sind. Am Ende der Erstellung dieser Listen möchte ich diese leeren Listen entfernen, bevor ich mein Wörterbuch zurückgebe. Derzeit versuche ich dies wie folgt zu tun:
for i in d:
if not d[i]:
d.pop(i)
Dies gibt mir jedoch den Laufzeitfehler. Mir ist bewusst, dass Sie keine Elemente in einem Wörterbuch hinzufügen / entfernen können, während Sie es durchlaufen ... was wäre dann ein Weg, dies zu umgehen?
quelle
keys
macht eine Kopie der Schlüssel , über die Sie iterieren können", auch bekannt als dieplural
Schlüssel, oder? Wie kann man sonst über einen einzelnen Schlüssel iterieren? Ich bin übrigens nicht picken, bin wirklich interessiert zu wissen, ob das tatsächlich Schlüssel oder Schlüssel istfor i in d.keys()
funktioniert in Python 3.x im Allgemeinen , aber da sie über eine iterierbare Ansicht der Schlüssel des Wörterbuchs iteriert, führt das Aufrufend.pop()
während der Schleife zu demselben Fehler, den Sie gefunden haben.for i in list(d)
emuliert das etwas ineffiziente Python 2-Verhalten beim Kopieren der Schlüssel in eine Liste vor dem Iterieren für besondere Umstände wie Ihre.list(d.keys())
dieselbe Ausgabe wie beimlist(d)
Aufrufenlist
von a unddict
gibt die Schlüssel zurück. Derkeys
Anruf (obwohl nicht so teuer) ist unnötig.Verwenden Sie einfach das Wörterbuchverständnis, um die relevanten Elemente in ein neues Diktat zu kopieren
Dafür in Python 3
quelle
d.iteritems()
gab mir einen Fehler. Ich habed.items()
stattdessen - mit Python3Sie müssen nur "copy" verwenden:
Auf diese Weise iterieren Sie über die ursprünglichen Wörterbuchfelder und können im laufenden Betrieb das gewünschte Diktat (d dict) ändern. Es ist Arbeit an jeder Python-Version, also ist es klarer.
quelle
Ich würde versuchen, das Einfügen leerer Listen zu vermeiden, würde aber im Allgemeinen Folgendes verwenden:
Wenn vor 2.7:
oder nur:
quelle
Für Python 3:
quelle
Sie können ein Wörterbuch nicht durchlaufen, während es sich während der for-Schleife ändert. Machen Sie ein Casting, um diese Liste aufzulisten und zu durchlaufen, es funktioniert für mich.
quelle
In solchen Situationen möchte ich eine tiefe Kopie erstellen und diese Kopie durchlaufen, während ich das ursprüngliche Diktat ändere.
Wenn sich das Suchfeld in einer Liste befindet, können Sie in der for-Schleife der Liste auflisten und dann die Position als Index angeben, um auf das Feld im ursprünglichen Diktat zuzugreifen.
quelle
Das hat bei mir funktioniert:
Wenn Sie die Wörterbuchelemente in eine Liste umwandeln, wird eine Liste der Elemente erstellt, sodass Sie darüber iterieren und das vermeiden können
RuntimeError
.quelle
dictc = {"stName": "asas"} keys = dictc.keys () für die Eingabe in die Liste (Schlüssel): dictc [key.upper ()] = 'Neuer Wert' print (str (dictc))
quelle
Der Grund für den Laufzeitfehler ist, dass Sie eine Datenstruktur nicht durchlaufen können, während sich ihre Struktur während der Iteration ändert.
Eine Möglichkeit, um das zu erreichen, wonach Sie suchen, besteht darin, die zu entfernenden Schlüssel mithilfe der Liste anzuhängen und dann den identifizierten Schlüssel mithilfe der Pop-Funktion im Wörterbuch zu entfernen, während Sie die Liste durchlaufen.
quelle
Python 3 erlaubt kein Löschen beim Iterieren des Wörterbuchs (unter Verwendung der obigen Schleife). Es gibt verschiedene Alternativen; Eine einfache Möglichkeit besteht darin, die folgende Zeile zu ändern
Mit
quelle