Frage Wie entferne ich einen Schlüssel aus einem Python-Wörterbuch?


Wenn ich versuche, einen Schlüssel aus einem Wörterbuch zu löschen, schreibe ich:

if 'key' in myDict:
    del myDict['key']

Gibt es einen One-line-Weg, dies zu tun?


1048
2018-06-30 20:27


Ursprung


Antworten:


Benutzen dict.pop():

my_dict.pop('key', None)

Dies wird zurückkehren my_dict[key] ob key existiert im Wörterbuch, und None Andernfalls. Wenn der zweite Parameter nicht angegeben ist (d. H. my_dict.pop('key')) und key existiert nicht, a KeyError ist erhöht.


1744
2018-06-30 20:29



Speziell um zu antworten "Gibt es einen One-line-Weg, dies zu tun?"

if 'key' in myDict: del myDict['key']

...also du fragte ;-)

Sie sollten jedoch berücksichtigen, dass diese Art des Löschens eines Objekts aus einer dict ist nicht atomar-es ist möglich, dass 'key' vielleicht in myDict während der if Aussage, kann aber vorher gelöscht werden del wird ausgeführt, in welchem ​​Fall del wird mit einem scheitern KeyError. In Anbetracht dessen wäre es am sichersten benutzen dict.pop oder etwas in der Art von

try:
    del myDict['key']
except KeyError:
    pass

Das ist natürlich definitiv nicht ein Einliner.


260
2018-06-30 20:36



Ich brauchte einige Zeit, um herauszufinden, was genau my_dict.pop("key", None) macht. Also füge ich das als eine Antwort hinzu, um andere zu retten, die Zeit googlen:

pop (Schlüssel [, Standard])

Wenn der Schlüssel im Wörterbuch ist, entferne ihn und gebe seinen Wert zurück, sonst   Standard zurückgeben Wenn der Standard nicht angegeben ist und der Schlüssel nicht in der   Wörterbuch wird ein KeyError ausgelöst

Dokumentation


115
2018-03-04 16:43



Timing der drei oben beschriebenen Lösungen.

Kleines Wörterbuch:

>>> import timeit
>>> timeit.timeit("d={'a':1}; d.pop('a')")
0.23399464370632472
>>> timeit.timeit("d={'a':1}; del d['a']")
0.15225347193388927
>>> timeit.timeit("d={'a':1}; d2 = {key: val for key, val in d.items() if key != 'a'}")
0.5365207354998063

Größeres Wörterbuch:

>>> timeit.timeit("d={nr: nr for nr in range(100)}; d.pop(3)")
5.478138627299643
>>> timeit.timeit("d={nr: nr for nr in range(100)}; del d[3]")
5.362219126590048
>>> timeit.timeit("d={nr: nr for nr in range(100)}; d2 = {key: val for key, val in d.items() if key != 3}")
13.93129749387532

25
2017-12-07 12:19



Wenn Sie viele Schlüssel aus einem Wörterbuch in einer Codezeile entfernen müssen, ist die Verwendung von map () ziemlich prägnant und Pythonic-lesbar:

myDict = {'a':1,'b':2,'c':3,'d':4}
map(myDict.pop, ['a','c']) # The list of keys to remove
>>> myDict
{'b': 2, 'd': 4}

Und wenn Sie Fehler finden müssen, wo Sie einen Wert, der nicht im Wörterbuch ist, auffüllen, verwenden Sie Lambda in map () wie folgt:

map(lambda x: myDict.pop(x,None), ['a','c','e'])
[1, 3, None] # pop returns
>>> myDict
{'b': 2, 'd': 4}

Es klappt. Und 'e' verursachte keinen Fehler, obwohl myDict keinen 'e' Schlüssel hatte.


20
2017-09-16 19:17



Benutzen:

>>> if myDict.get(key): myDict.pop(key)

Ein anderer Weg:

>>> {k:v for k, v in myDict.items() if k != 'key'}

Sie können nach Bedingungen löschen. Kein Fehler wenn key existiert nicht.


14
2017-12-07 05:52



Verwenden Sie das Schlüsselwort "del":

del dict[key]

5
2018-05-02 10:22



Wir können einen Schlüssel aus einem Python-Wörterbuch mit den folgenden Methoden löschen.

Verwendung der del Stichwort; es ist fast der gleiche Ansatz wie du es getan hast -

 myDict = {'one': 100, 'two': 200, 'three': 300 }
 print(myDict)  # {'one': 100, 'two': 200, 'three': 300}
 if myDict.get('one') : del myDict['one']
 print(myDict)  # {'two': 200, 'three': 300}

Oder

Wir können folgendes tun:

Aber man sollte bedenken, dass dies bei diesem Prozess nicht der Fall ist löschen einen beliebigen Schlüssel aus dem Wörterbuch, anstatt einen spezifischen Schlüssel zu erstellen ausgeschlossen aus diesem Wörterbuch. Außerdem beobachtete ich, dass es ein Wörterbuch zurückgab, das nicht gleich bestellt war myDict.

myDict = {'one': 100, 'two': 200, 'three': 300, 'four': 400, 'five': 500}
{key:value for key, value in myDict.items() if key != 'one'}

Wenn wir es in der Shell ausführen, wird etwas ähnliches ausgeführt {'five': 500, 'four': 400, 'three': 300, 'two': 200} - Beachten Sie, dass es nicht gleich bestellt ist myDict. Auch wenn wir versuchen zu drucken myDict, dann können wir alle Schlüssel einschließlich sehen, die wir aus dem Wörterbuch durch diesen Ansatz ausgeschlossen haben. Wir können jedoch ein neues Wörterbuch erstellen, indem wir die folgende Anweisung einer Variablen zuweisen:

var = {key:value for key, value in myDict.items() if key != 'one'}

Wenn wir jetzt versuchen, es zu drucken, folgt es der übergeordneten Reihenfolge:

print(var) # {'two': 200, 'three': 300, 'four': 400, 'five': 500}

Oder

Verwendung der pop() Methode.

myDict = {'one': 100, 'two': 200, 'three': 300}
print(myDict)

if myDict.get('one') : myDict.pop('one')
print(myDict)  # {'two': 200, 'three': 300}

Der Unterschied zwischen del und pop ist das, mit pop()Methode, können wir das speichern Schlüsselwert bei Bedarf, wie folgt:

myDict = {'one': 100, 'two': 200, 'three': 300}
if myDict.get('one') : var = myDict.pop('one')
print(myDict) # {'two': 200, 'three': 300}
print(var)    # 100

3
2018-05-19 10:09