507 Stimmen

Wie kann ich den Fehler "RuntimeError: dictionary changed size during iteration" vermeiden?

Ich habe ein Wörterbuch mit Listen, in dem einige der Werte leer sind:

d = {'a': [1], 'b': [1, 2], 'c': [], 'd':[]}

Am Ende der Erstellung dieser Listen möchte ich diese leeren Listen entfernen, bevor ich mein Wörterbuch zurückgeben kann. Ich habe versucht, es so zu machen:

for i in d:
    if not d[i]:
        d.pop(i)

aber ich habe eine RuntimeError . Ich bin mir bewusst, dass man keine Elemente in einem Wörterbuch hinzufügen/entfernen kann, während man es durchläuft ... wie könnte man das dann umgehen?


Voir <a href="https://stackoverflow.com/questions/6777485/">Ändern eines Python-Diktats bei der Iteration über das Diktat </a>für Zitate, die zeigen, dass dies zu Problemen führen kann, und warum.

15voto

Jon Clements Punkte 134241

Ich würde versuchen, das Einfügen von leeren Listen von vornherein zu vermeiden, aber ich würde sie im Allgemeinen verwenden:

d = {k: v for k,v in d.iteritems() if v} # re-bind to non-empty

Wenn vor dem 2.7:

d = dict( (k, v) for k,v in d.iteritems() if v )

oder einfach:

empty_key_vals = list(k for k in k,v in d.iteritems() if v)
for k in empty_key_vals:
    del[k]

13voto

ucyo Punkte 597

Für Python 3:

{k:v for k,v in d.items() if v}

8voto

Sie können nicht durch ein Wörterbuch iterieren, während es sich während einer für Schleife. Machen Sie ein Casting auf Liste und iterieren Sie über diese Liste. Es funktioniert für mich.

    for key in list(d):
        if not d[key]:
            d.pop(key)

2voto

Rohit Punkte 17

Der Grund für den Laufzeitfehler ist, dass Sie nicht durch eine Datenstruktur iterieren können, während sich ihre Struktur während der Iteration ändert.

Eine Möglichkeit, das zu erreichen, was Sie suchen, ist die Verwendung einer Liste, an die Sie die zu entfernenden Schlüssel anhängen und dann die Funktion pop Funktion im Wörterbuch, um den identifizierten Schlüssel zu entfernen, während die Liste durchlaufen wird.

d = {'a': [1], 'b': [1, 2], 'c': [], 'd':[]}
pop_list = []

for i in d:
        if not d[i]:
                pop_list.append(i)

for x in pop_list:
        d.pop(x)
print (d)

2voto

Hasham Beyg Punkte 315

Python 3 erlaubt kein Löschen während des Iterierens (unter Verwendung der für Schleife oben) ein Wörterbuch. Es gibt verschiedene Möglichkeiten, dies zu tun; eine einfache Möglichkeit besteht darin, die Zeile

for i in x.keys():

mit

for i in list(x)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X