Entfernen eines Elements aus einem Wörterbuch, wenn Ihr Schlüssel ist unbekannt
Was ist der beste Weg, um entfernen Sie ein Element aus einem dictionary-by-value, d.h. wenn das Element key ist unbekannt? 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? Gibt es etwas falsch mit mutierenden (löschen von items) aus dem Wörterbuch während der Iteration es?
- Das unterstreichen Grund für das Verbot mutierend dict während der Iteration ist es, denn intern gibt es eine Reihenfolge für die iteration, wenn Sie mutieren Sie die Tasten, um die würde untergraben werden, die Ergebnisse unbekanntes Verhalten.
- Mögliche Duplikate von so entfernen Sie einen Schlüssel aus einem python-dictionary?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sich bewusst sein, dass Sie gerade die Prüfung für die Objekt-Identität (
is
gibt nurTrue
wenn beide Operanden sind vertreten durch das gleiche Objekt im Speicher - das ist nicht immer der Fall mit zwei Objekt, vergleichen Sie gleich mit==
). Wenn Sie dies tun, mit Absicht, dann könnten Sie ändern Sie Ihren code wieAber dies kann nicht tun, was Sie wollen:
So dass Sie wahrscheinlich wollen
!=
stattis not
.some_dict.iteritems()
hier und setzenfor
undif
- Anweisungen in separaten Zeilen für eine bessere Lesbarkeititeritems
ist jetztitems
. In Python 2.7,iteritems()
ist in der Tat besser.dict()
mit einem entsprechenden generator, der Ausdruck, die 2.4. meta: kann durchsuchen Sie die peps hier für die Suche nach stuff out.Den
dict.pop(key[, default])
Methode ermöglicht es Ihnen, um Elemente zu entfernen, wenn Sie wissen, der Schlüssel. Es gibt den Wert an der den Schlüssel, wenn es entfernt das Element ansonsten gibt es, was ist vergangen, alsdefault
. Sehen die docs.'Beispiel:
Einen einfachen Vergleich zwischen del und pop():
Ergebnis:
So, del ist schneller als pop().
pop()
(as @n-1-1 ist oben) - das ist nicht eine option für diedel
Betreiber.timeit
. Vielen Dank für dieses deutliche Beispiel.items()
gibt eine Liste, und es ist diese Liste, die Sie Durchlaufen, so mutiert das dict in der Schleife spielt keine Rolle hier. Wenn Sie wurden mititeritems()
stattdessen mutiert das dict in der Schleife wäre problematisch, und ebenso fürviewitems()
in Python 2.7.Ich kann nicht denken, einen besseren Weg, um entfernen von Elementen aus einem dict-Wert.
Ich würde erstellen Sie eine Liste von Schlüsseln, die Notwendigkeit entfernen, dann entfernen Sie Sie. Es ist einfach, effizient und vermeidet das problem, gleichzeitig iteriert und mutiert die dict.
c ist das neue Wörterbuch, und a ist die ursprüngliche Wörterbuch, {'z','w'}
sind die Tasten, die Sie entfernen möchten aus einer
Überprüfen Sie auch: https://www.safaribooksonline.com/library/view/python-cookbook-3rd/9781449357337/ch01.html
Es ist nichts falsch mit dem löschen von Elementen aus dem Wörterbuch während der Iteration, wie Sie vorgeschlagen habe. Vorsichtig sein, über mehrere threads mit der gleichen Wörterbuch zur gleichen Zeit, die einen KeyError oder andere Probleme.
Natürlich, siehe die Dokumentation auf http://docs.python.org/library/stdtypes.html#typesmapping
for k,v in d.iteritems(): del d[k]
geben würdeRuntimeError: dictionary changed size during iteration
. Sehen mithrandi Erklärung.Dies ist, wie ich es tun würde.