Ein Element aus einem Wörterbuch entfernen, wenn sein Schlüssel unbekannt ist

Wie entfernt man am besten ein Element aus einem Wörterbuch nach Wert, d. h. wenn der Schlüssel des Elements unbekannt ist? Hier ist ein einfacher Ansatz:

for key, item in some_dict.items():
    if item is item_to_remove:
        del some_dict[key]

Gibt es bessere Methoden? Ist etwas falsch daran, Elemente im Wörterbuch zu verändern (zu löschen), während es iteriert wird?

Lösung

Seien Sie sich bewusst, dass Sie derzeit auf Objektidentität testen (ist gibt nur True zurück, wenn beide Operanden durch dasselbe Objekt im Speicher repräsentiert werden - dies ist bei zwei Objekten, die mit == gleich sind, nicht immer der Fall). Wenn Sie dies absichtlich tun, dann könnten Sie Ihren Code umschreiben als

some_dict = {key: value for key, value in some_dict.items() 
             if value is not value_to_remove}

Aber das führt vielleicht nicht zu dem, was Sie wollen:

>>> some_dict = {1: "Hello", 2: "Goodbye", 3: "You say yes", 4: "I say no"}
>>> value_to_remove = "You say yes"
>>> some_dict = {key: value for key, value in some_dict.items() if value is not value_to_remove}
>>> some_dict
{1: 'Hello', 2: 'Goodbye', 3: 'You say yes', 4: 'I say no'}
>>> some_dict = {key: value for key, value in some_dict.items() if value != value_to_remove}
>>> some_dict
{1: 'Hello', 2: 'Goodbye', 4: 'I say no'}

Du willst also wahrscheinlich != anstelle von ist nicht.

Kommentare (5)

items() gibt eine Liste zurück, und es ist diese Liste, die Sie iterieren, so dass die Änderung des Diktats in der Schleife hier keine Rolle spielt. Wenn Sie stattdessen iteritems() verwenden würden, wäre das Ändern des Diktats in der Schleife problematisch1, und dasselbe gilt für viewitems() in Python 2.7.

Ich kann mir keinen besseren Weg vorstellen, um Elemente aus einem Diktat nach Wert zu entfernen.

Kommentare (0)

Es ist nichts falsch daran, Elemente aus dem Wörterbuch zu löschen, während man iteriert, wie Sie vorgeschlagen haben. Seien Sie vorsichtig, wenn mehrere Threads das gleiche Wörterbuch gleichzeitig verwenden, da dies zu einem KeyError oder anderen Problemen führen kann.

Natürlich, siehe die Dokumente auf http://docs.python.org/library/stdtypes.html#typesmapping

Kommentare (2)