Beim Löschen eines Schlüssels aus einem Wörterbuch verwende ich:
if 'key' in my_dict:
del my_dict['key']
Gibt es eine einzeilige Möglichkeit, dies zu tun?
Beim Löschen eines Schlüssels aus einem Wörterbuch verwende ich:
if 'key' in my_dict:
del my_dict['key']
Gibt es eine einzeilige Möglichkeit, dies zu tun?
Antworten:
Verwenden Sie die Zwei-Argumente-Form von
dict.pop()
: Um einen Schlüssel zu löschen, unabhängig davon, ob er sich im Wörterbuch befindet :Dies wird zurückgegeben,
my_dict[key]
wennkey
es im Wörterbuch vorhanden ist, undNone
ansonsten. Wenn der zweite Parameter nicht angegeben ist (dhmy_dict.pop('key')
) undkey
nicht existiert,KeyError
wird a ausgelöst.Sie können auch einen Schlüssel löschen, dessen Existenz garantiert ist
Dies löst ein aus,
KeyError
wenn sich der Schlüssel nicht im Wörterbuch befindet.quelle
pop()
overdel
: Es wird der Wert für diesen Schlüssel zurückgegeben. Auf diese Weise können Sie einen Eintrag aus einem Diktat in einer Codezeile abrufen und löschen.try
/except
-Lösung, wenn der Schlüssel nicht vorhanden ist. Möglicherweise ist das eine oder andere leichter zu lesen, was in Ordnung ist. Beide sind idiomatische Python, wählen Sie also, was Sie bevorzugen. Die Behauptung, diese Antwort sei komplexer oder ineffizienter, macht einfach keinen Sinn.self
, daher wäre es ziemlich überraschend, wenn dies der Fall wäre.Speziell zu antworten: "Gibt es eine einzeilige Möglichkeit, dies zu tun?"
... na du hast gefragt ;-)
Sie sollten jedoch bedenken, dass auf diese Weise ein Objekt aus einem zu löschen
dict
ist nicht atomar -es ist möglich , dass'key'
sein in kannmy_dict
während derif
Aussage, aber kann , bevor sie gelöscht werden ,del
ausgeführt wird , wobei in diesem Falldel
mit einem fehlschlagen wirdKeyError
. Vor diesem Hintergrund wäre es am sichersten zu jeder Nutzungdict.pop
oder etwas entlang der Linien vonDas ist natürlich definitiv kein Einzeiler.
quelle
pop
ist definitiv prägnanter, obwohl es einen entscheidenden Vorteil gibt, es so zu machen: Es ist sofort klar, was es tut.try/except
Aussage ist teurer. Das Auslösen einer Ausnahme ist langsam.try
geringfügig schneller ist, wenn er nicht vorhanden ist,try
ist er in der Tat viel langsamer.pop
ist ziemlich konsistent, aber langsamer als alle anderen, jedochtry
mit einem nicht vorhandenen Schlüssel. Siehe gist.github.com/zigg/6280653 . Letztendlich hängt es davon ab, wie oft Sie erwarten, dass der Schlüssel tatsächlich im Wörterbuch enthalten ist, und ob Sie Atomizität benötigen oder nicht - und natürlich, ob Sie sich auf vorzeitige Optimierungif 'key' in mydict: #then del...
. Ich musste einen Schlüssel / Wert aus einem Diktat herausziehen, um richtig zu analysieren. Pop war keine perfekte Lösung.Ich habe einige Zeit gebraucht, um herauszufinden, was genau
my_dict.pop("key", None)
passiert. Also werde ich dies als Antwort hinzufügen, um anderen Zeit beim Googeln zu sparen:Dokumentation
quelle
dict.pop?
in IPython.del my_dict[key]
ist etwas schneller alsmy_dict.pop(key)
zum Entfernen eines Schlüssels aus einem Wörterbuch, wenn der Schlüssel vorhanden istAber wenn der Schlüssel nicht existiert,
if key in my_dict: del my_dict[key]
ist etwas schneller alsmy_dict.pop(key, None)
. Beide sind mindestens dreimal schneller alsdel
in einertry
/except
-Anweisung:quelle
pop
in a geändert habendel
. Das Erstellen des Wörterbuchs wird das Löschen von Inhalten vollständig in den Schatten stellen.del
undpop
vom ersten Satz von Timings oben)Wenn Sie viele Schlüssel in einer Codezeile aus einem Wörterbuch entfernen müssen, ist die Verwendung von map () meiner Meinung nach recht prägnant und pythonisch lesbar:
Und wenn Sie Fehler abfangen müssen, bei denen Sie einen Wert einfügen, der nicht im Wörterbuch enthalten ist, verwenden Sie Lambda in map () wie folgt:
oder in
python3
müssen Sie stattdessen ein Listenverständnis verwenden:Es klappt. Und 'e' hat keinen Fehler verursacht, obwohl myDict keinen 'e'-Schlüssel hatte.
quelle
map
Freunde jetzt faul sind und Iteratoren zurückgeben. Die Anwendungmap
bei Nebenwirkungen wird im Allgemeinen als schlechte Praxis angesehen. Eine Standardschleifefor ... in
wäre besser. Weitere Informationen finden Sie unter Ansichten und Iteratoren anstelle von Listen .[myDict.pop(i, None) for i in ['a', 'c']]
, da es eine allgemeine Alternative zumap
(undfilter
) darstellt.for ... in
Schleife.map()
, die häufig wegen ihrer Nebenwirkungen verwendet wird. Die empfohlene Alternative in Python ist das Listenverständnis, das meiner Meinung nach als Einzeiler noch gut lesbar und kognitiv leicht ist (siehe Frage). Beide Konstrukte werden nur wegen ihrer Nebenwirkungen verwendet und führen tatsächlich zu einer nutzlosen Liste, die ineffizient sein kann. Ab Python3 ist mir keine integrierte Funktion bekannt, die einen Generatorausdruck sicher und elegant durchlaufen kann, ohne ein kostspieliges Nebenprodukt, zloop(d.pop(k) for k in ['a', 'b'])
.Sie können ein Wörterbuchverständnis verwenden , um ein neues Wörterbuch mit entferntem Schlüssel zu erstellen:
Sie können nach Bedingungen löschen. Kein Fehler, wenn
key
nicht vorhanden.quelle
Verwenden des Schlüsselworts "del":
quelle
Wir können einen Schlüssel aus einem Python-Wörterbuch durch die folgenden Ansätze löschen.
Verwenden des
del
Schlüsselworts; Es ist fast der gleiche Ansatz wie Sie -Oder
Wir können Folgendes tun:
Man sollte jedoch bedenken, dass in diesem Prozess tatsächlich kein Schlüssel aus dem Wörterbuch gelöscht wird, anstatt einen bestimmten Schlüssel aus diesem Wörterbuch auszuschließen . Außerdem stellte ich fest, dass ein Wörterbuch zurückgegeben wurde, das nicht wie das gleiche bestellt wurde
myDict
.Wenn wir es in der Shell ausführen, wird es ungefähr so ausgeführt
{'five': 500, 'four': 400, 'three': 300, 'two': 200}
- beachten Sie, dass es nicht die gleiche Reihenfolge wie hatmyDict
. Wenn wir erneut versuchen zu druckenmyDict
, können wir alle Schlüssel sehen, einschließlich derer, die wir durch diesen Ansatz aus dem Wörterbuch ausgeschlossen haben. Wir können jedoch ein neues Wörterbuch erstellen, indem wir einer Variablen die folgende Anweisung zuweisen:Wenn wir nun versuchen, es zu drucken, folgt es der übergeordneten Reihenfolge:
Oder
Mit der
pop()
Methode.Der Unterschied zwischen
del
undpop
besteht darin, dasspop()
wir mithilfe der Methode den Wert des Schlüssels bei Bedarf tatsächlich speichern können , wie folgt:Gabel diesen Kern für die Zukunft, wenn Sie diesen Kommentar hilfreich.
quelle
if myDict.get('one')
Überprüfen Sie nicht , ob ein Schlüssel vorhanden ist! Es schlägt fehl, wenn myDict ['one'] einen Falsey-Wert hat. Außerdem haben Diktate keine inhärente Reihenfolge, daher ist es nicht sinnvoll, sie zu erwähnen.Sie können die Ausnahmebehandlung verwenden, wenn Sie sehr ausführlich sein möchten:
Dies ist jedoch langsamer als die
pop()
Methode, wenn der Schlüssel nicht vorhanden ist.Für ein paar Tasten spielt es keine Rolle, aber wenn Sie dies wiederholt tun, ist die letztere Methode die bessere Wahl.
Der schnellste Ansatz ist folgender:
Diese Methode ist jedoch gefährlich, da a entfernt wird, wenn
'key'
sie zwischen den beiden Zeilen entferntKeyError
wird.quelle
Ich bevorzuge die unveränderliche Version
quelle
Eine andere Möglichkeit ist die Verwendung von Elementen () + Diktatverständnis
items () in Verbindung mit dem Verständnis von Diktaten können uns auch dabei helfen, die Aufgabe des Löschens von Schlüssel-Wert-Paaren zu erreichen. Es hat jedoch den Nachteil, keine Inplace-Diktiertechnik zu sein. Eigentlich ein neues Diktat, wenn es erstellt wird, mit Ausnahme des Schlüssels, den wir nicht einschließen möchten.
Ausgabe:
quelle
Einzelfilter am Schlüssel
Mehrere Filter auf Schlüsseln
quelle