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.

0voto

In solchen Fällen erstelle ich gerne eine Kopie und führe eine Schleife durch diese Kopie, während ich das Original ändere Diktat .

Befindet sich das Nachschlagefeld innerhalb einer Liste, können Sie in der für Schleife der Liste und geben Sie dann die Position als Index für den Zugriff auf das Feld in der ursprünglichen Diktat .

0voto

Md Shayon Punkte 51
  • Die Python "RuntimeError: Wörterbuch hat Größe während Iteration geändert" tritt auf, wenn wir die Größe eines Wörterbuchs ändern, während wir darüber iterieren.

  • Um den Fehler zu beheben, verwenden Sie die copy()-Methode, um eine flache Kopie des Wörterbuchs zu erstellen, über die Sie iterieren können, z. B., my_dict.copy() .

    my_dict = {'a': 1, 'b': 2, 'c': 3}
    
    for key in my_dict.copy():
        print(key)
        if key == 'b':
            del my_dict[key]
    
    print(my_dict) #  {'a': 1, 'c': 3}
  • Sie können die Schlüssel des Wörterbuchs auch in eine Liste umwandeln und über die Liste der Schlüssel iterieren.

    my_dict = {'a': 1, 'b': 2, 'c': 3}
    
    for key in list(my_dict.keys()):
        print(key)
        if key == 'b':
            del my_dict[key]
    
    print(my_dict)  #  {'a': 1, 'c': 3}

-1voto

Ganesh S Punkte 421

Wenn die Werte im Wörterbuch ebenfalls eindeutig waren, habe ich diese Lösung verwendet:

keyToBeDeleted = None
for k, v in mydict.items():
    if(v == match):
        keyToBeDeleted = k
        break
mydict.pop(keyToBeDeleted, None)

-1voto

Echo9k Punkte 338

Verschachtelte Nullwerte

Angenommen, wir haben ein Wörterbuch mit verschachtelten Schlüsseln, von denen einige Nullwerte sind:

dicti = {
"k0_l0":{
    "k0_l1": {
        "k0_l2": {
                "k0_0":None,
                "k1_1":1,
                "k2_2":2.2
                }
        },
        "k1_l1":None,
        "k2_l1":"not none",
        "k3_l1":[]
    },
    "k1_l0":"l0"
}

Dann können wir die Nullwerte mit dieser Funktion entfernen:

def pop_nested_nulls(dicti):
    for k in list(dicti):
        if isinstance(dicti[k], dict):
            dicti[k] = pop_nested_nulls(dicti[k])
        elif not dicti[k]:
            dicti.pop(k)
    return dicti

Ausgabe für pop_nested_nulls(dicti)

{'k0_l0': {'k0_l1': {'k0_l2': {'k1_1': 1,
                               'k2_2': 2.2}},
           'k2_l1': 'not '
                    'none'},
 'k1_l0': 'l0'}

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