Was ist der beste Weg, um ein Element nach Wert aus einem Wörterbuch zu entfernen, dh 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 Möglichkeiten? Ist etwas falsch daran, Elemente während der Iteration aus dem Wörterbuch zu mutieren (zu löschen)?
python
dictionary
Buttons840
quelle
quelle
Antworten:
Beachten Sie, dass Sie derzeit auf Objektidentität testen (wird
is
nur zurückgegeben,True
wenn beide Operanden durch dasselbe Objekt im Speicher dargestellt werden - dies ist nicht immer bei zwei Objekten der Fall, die mit gleich verglichen werden==
). Wenn Sie dies absichtlich tun, können Sie Ihren Code als neu schreibenDies kann jedoch nicht das tun, was Sie wollen:
Also willst du wahrscheinlich
!=
stattis not
.quelle
some_dict.iteritems()
hier und stellenfor
undif
Aussagen über separate Leitungen zur besseren Lesbarkeititeritems
es jetztitems
. In Python 2.7iteritems()
ist das in der Tat besser.dict()
mit einem geeigneten Generatorausdruck füttern , nämlich 2.4. meta: kann hier die peps durchsuchen, um etwas herauszufinden.Mit dieser
dict.pop(key[, default])
Methode können Sie Elemente entfernen, wenn Sie den Schlüssel kennen. Es gibt den Wert am Schlüssel zurück, wenn es das Element entfernt, andernfalls gibt es zurück, als was übergeben wirddefault
. Siehe die Dokumente . 'Beispiel:
quelle
quelle
Ein einfacher Vergleich zwischen del und pop () :
Ergebnis:
So del ist schneller als pop () .
quelle
pop()
(wie oben bei @ n-1-1) - was für dendel
Operator keine Option ist .timeit
. Vielen Dank für dieses klare Beispiel.items()
Gibt eine Liste zurück, und es ist diese Liste, die Sie iterieren. Daher spielt es hier keine Rolle, das Diktat in der Schleife zu mutieren. Wenn Sieiteritems()
stattdessen verwenden, wäre das Mutieren des Diktats in der Schleife problematisch , und ebenso fürviewitems()
Python 2.7.Ich kann mir keinen besseren Weg vorstellen, um Elemente nach Wert aus einem Diktat zu entfernen.
quelle
Ich würde eine Liste von Schlüsseln erstellen, die entfernt werden müssen, und sie dann entfernen. Es ist einfach, effizient und vermeidet jedes Problem, das Diktat gleichzeitig zu wiederholen und zu mutieren.
quelle
c ist das neue Wörterbuch und a ist Ihr ursprüngliches Wörterbuch. {'z', 'w'} sind die Schlüssel, die Sie aus a entfernen möchten
Überprüfen Sie auch: https://www.safaribooksonline.com/library/view/python-cookbook-3rd/9781449357337/ch01.html
quelle
quelle
Es ist nichts Falsches daran, Elemente aus dem Wörterbuch zu löschen, während Sie iterieren, wie Sie vorgeschlagen haben. Seien Sie vorsichtig, wenn mehrere Threads gleichzeitig dasselbe Wörterbuch verwenden, was zu einem KeyError oder anderen Problemen führen kann.
Weitere Informationen finden Sie in den Dokumenten unter http://docs.python.org/library/stdtypes.html#typesmapping
quelle
for k,v in d.iteritems(): del d[k]
würde gebenRuntimeError: dictionary changed size during iteration
. Siehe Mithrandis Erklärung.So würde ich es machen.
quelle