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 :
my_dict.pop('key', None)
Dies wird zurückgegeben, my_dict[key]
wenn key
es im Wörterbuch vorhanden ist, und None
ansonsten. Wenn der zweite Parameter nicht angegeben ist (dh my_dict.pop('key')
) und key
nicht existiert, KeyError
wird a ausgelöst.
Sie können auch einen Schlüssel löschen, dessen Existenz garantiert ist
del my_dict['key']
Dies löst ein aus, KeyError
wenn sich der Schlüssel nicht im Wörterbuch befindet.
pop()
over del
: 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?"
if 'key' in my_dict: del my_dict['key']
... 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 kann my_dict
während der if
Aussage, aber kann , bevor sie gelöscht werden , del
ausgeführt wird , wobei in diesem Fall del
mit einem fehlschlagen wird KeyError
. Vor diesem Hintergrund wäre es am sichersten zu jeder Nutzungdict.pop
oder etwas entlang der Linien von
try:
del my_dict['key']
except KeyError:
pass
Das ist natürlich definitiv kein Einzeiler.
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, jedoch try
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 Optimierung
if '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:
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 sich der Schlüssel nicht im Wörterbuch befindet,
KeyError
wird a ausgelöst.
dict.pop?
in IPython.
del my_dict[key]
ist etwas schneller als my_dict.pop(key)
zum Entfernen eines Schlüssels aus einem Wörterbuch, wenn der Schlüssel vorhanden ist
>>> import timeit
>>> setup = "d = {i: i for i in range(100000)}"
>>> timeit.timeit("del d[3]", setup=setup, number=1)
1.79e-06
>>> timeit.timeit("d.pop(3)", setup=setup, number=1)
2.09e-06
>>> timeit.timeit("d2 = {key: val for key, val in d.items() if key != 3}", setup=setup, number=1)
0.00786
Aber wenn der Schlüssel nicht existiert, if key in my_dict: del my_dict[key]
ist etwas schneller als my_dict.pop(key, None)
. Beide sind mindestens dreimal schneller als del
in einer try
/ except
-Anweisung:
>>> timeit.timeit("if 'missing key' in d: del d['missing key']", setup=setup)
0.0229
>>> timeit.timeit("d.pop('missing key', None)", setup=setup)
0.0426
>>> try_except = """
... try:
... del d['missing key']
... except KeyError:
... pass
... """
>>> timeit.timeit(try_except, setup=setup)
0.133
pop
in a geändert haben del
. Das Erstellen des Wörterbuchs wird das Löschen von Inhalten vollständig in den Schatten stellen.
del
und pop
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:
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' hat keinen Fehler verursacht, obwohl myDict keinen 'e'-Schlüssel hatte.
map
Freunde jetzt faul sind und Iteratoren zurückgeben. Die Anwendung map
bei Nebenwirkungen wird im Allgemeinen als schlechte Praxis angesehen. Eine Standardschleife for ... 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 zu map
(und filter
) 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, z loop(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:
>>> my_dict = {k: v for k, v in my_dict.items() if k != 'key'}
Sie können nach Bedingungen löschen. Kein Fehler, wenn key
nicht vorhanden.
Verwenden des Schlüsselworts "del":
del dict[key]
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 -
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:
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
.
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 es ungefähr so ausgeführt {'five': 500, 'four': 400, 'three': 300, 'two': 200}
- beachten Sie, dass es nicht die gleiche Reihenfolge wie hat myDict
. Wenn wir erneut versuchen zu drucken myDict
, 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:
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
Mit 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
besteht darin, dass pop()
wir mithilfe der Methode den Wert des Schlüssels bei Bedarf tatsächlich speichern können , 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
Gabel diesen Kern für die Zukunft, wenn Sie diesen Kommentar hilfreich.
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:
try:
del dict[key]
except KeyError: pass
Dies ist jedoch langsamer als die pop()
Methode, wenn der Schlüssel nicht vorhanden ist.
my_dict.pop('key', None)
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:
if 'key' in dict:
del myDict['key']
Diese Methode ist jedoch gefährlich, da a entfernt wird, wenn 'key'
sie zwischen den beiden Zeilen entfernt KeyError
wird.
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.
test_dict = {"sai" : 22, "kiran" : 21, "vinod" : 21, "sangam" : 21}
# Printing dictionary before removal
print ("dictionary before performing remove is : " + str(test_dict))
# Using items() + dict comprehension to remove a dict. pair
# removes vinod
new_dict = {key:val for key, val in test_dict.items() if key != 'vinod'}
# Printing dictionary after removal
print ("dictionary after remove is : " + str(new_dict))
Ausgabe:
dictionary before performing remove is : {'sai': 22, 'kiran': 21, 'vinod': 21, 'sangam': 21}
dictionary after remove is : {'sai': 22, 'kiran': 21, 'sangam': 21}
dies wird sich ändern
my_dict
(veränderlich)
my_dict.pop('key', None)
ein neues Diktat generieren (unveränderlich)
dic1 = {
"x":1,
"y": 2,
"z": 3
}
def func1(item):
return item[0]!= "x" and item[0] != "y"
print(
dict(
filter(
lambda item: item[0] != "x" and item[0] != "y",
dic1.items()
)
)
)