it-swarm.com.de

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

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

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

Gibt es eine einzeilige Möglichkeit, dies zu tun?

1439
Tony

Verwenden Sie dict.pop() :

my_dict.pop('key', None)

Dies gibt my_dict[key] zurück, wenn key im Wörterbuch vorhanden ist, andernfalls None. Wenn der zweite Parameter nicht angegeben ist (dh my_dict.pop('key')) und key nicht vorhanden ist, wird KeyError ausgelöst.

2354
Sven Marnach

Speziell zu beantworten "Gibt es eine einzeilige Möglichkeit, dies zu tun?"

_if 'key' in myDict: del myDict['key']
_

... na ja, du gefragt ​​;-)

Sie sollten jedoch berücksichtigen, dass diese Methode zum Löschen eines Objekts aus einer dictnicht atomar - ist. Möglicherweise befindet sich _'key'_ während der myDict -Anweisung in if, kann jedoch zuvor gelöscht werden del wird ausgeführt. In diesem Fall schlägt del mit KeyError fehl. In Anbetracht dessen wäre es am sichersten, entweder benutze _dict.pop_ oder etwas in der Art von

_try:
    del myDict['key']
except KeyError:
    pass
_

was natürlich definitiv nicht ​​ein Einzeiler ist.

323
zigg

Ich habe einige Zeit gebraucht, um herauszufinden, was genau my_dict.pop("key", None) tut. Also füge ich dies als Antwort hinzu, um anderen die Zeit zum googeln zu ersparen:

pop (key [ default])

Wenn sich der Schlüssel im Wörterbuch befindet, entfernen Sie ihn und geben Sie seinen Wert zurück, andernfalls geben Sie den Standardwert zurück. Wenn die Standardeinstellung nicht angegeben ist und der Schlüssel nicht im Wörterbuch enthalten ist, wird ein KeyError ausgelöst

Dokumentation

130
Akavall

Timing der drei oben beschriebenen Lösungen.

del ist die schnellste Methode zum Entfernen eines Schlüssels aus einem Python Wörterbuch

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
40
Peter Smit

Wenn Sie viele Schlüssel aus einem Wörterbuch in einer Codezeile entfernen müssen, ist die Verwendung von map () ziemlich prägnant und von 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 abfangen müssen, bei denen Sie einen Wert einfügen, der nicht im Wörterbuch enthalten ist, 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}

oder in python3 müssen Sie stattdessen ein Listenverständnis verwenden:

[myDict.pop(x, None) for x in ['a', 'c', 'e']]

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

36
Marc Maxmeister

Verwenden:

>>> 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 nicht vorhanden ist.

17
Shameem

Verwenden Sie das Schlüsselwort "del":

del dict[key]
13
Sarthak Gupta

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

Verwenden Sie das Schlüsselwort del. Es ist fast der gleiche Ansatz wie du -

 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 es in diesem Prozess eigentlich keinen Schlüssel aus dem Wörterbuch löschen anstatt einen bestimmten Schlüssel ausschließen aus diesem Wörterbuch zu machen. Außerdem habe ich festgestellt, dass ein Wörterbuch zurückgegeben wurde, das nicht wie myDict bestellt wurde.

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, führt es so etwas wie {'five': 500, 'four': 400, 'three': 300, 'two': 200} aus. Beachten Sie, dass es nicht die gleiche Reihenfolge wie myDict hat. Wenn wir erneut versuchen, myDict zu drucken, werden alle Schlüssel angezeigt, einschließlich derer, die wir auf diese Weise aus dem Wörterbuch ausgeschlossen haben. Sie können jedoch ein neues Wörterbuch erstellen, indem Sie einer Variablen die folgende Anweisung zuweisen:

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

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

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

oder

Verwenden Sie die Methode pop().

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 besteht darin, dass wir mit der pop() -Methode bei Bedarf den key's value speichern können, wie zum Beispiel:

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

Fork this Zum späteren Nachschlagen, falls Sie dies nützlich finden.

7
iNet

Sie können die Ausnahmebehandlung verwenden, wenn Sie sehr ausführlich sein möchten:

try: 
    del dict[key]

except KeyError: pass

Dies ist jedoch langsamer als die Methode pop(), wenn der Schlüssel nicht vorhanden ist.

my_dict.pop('key', None)

Ein paar Tasten spielen keine Rolle, aber wenn Sie dies wiederholt tun, ist die letztere Methode die bessere Wahl.

Der schnellste Ansatz ist dieser:

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

Diese Methode ist jedoch gefährlich, da, wenn 'key' zwischen den beiden Zeilen entfernt wird, ein KeyError ausgelöst wird.

2
Alec Alameddine

Ich bevorzuge die unveränderliche Version

foo = {
    1:1,
    2:2,
    3:3
}
removeKeys = [1,2]
def woKeys(dct, keyIter):
    return {
        k:v
        for k,v in dct.items() if k not in keyIter
    }

>>> print(woKeys(foo, removeKeys))
{3: 3}
>>> print(foo)
{1: 1, 2: 2, 3: 3}
1
CervEd