2675 Stimmen

Prüfen, ob ein bestimmter Schlüssel bereits in einem Wörterbuch existiert

Ich wollte testen, ob ein Schlüssel in einem Wörterbuch vorhanden ist, bevor ich den Wert für den Schlüssel aktualisiere. Ich habe den folgenden Code geschrieben:

if 'key1' in dict.keys():
  print "blah"
else:
  print "boo"

Ich denke, dass dies nicht der beste Weg ist, um diese Aufgabe zu bewältigen. Gibt es eine bessere Möglichkeit, nach einem Schlüssel im Wörterbuch zu suchen?

31 Stimmen

Aufruf von dict.keys() erstellt eine Liste von Schlüsseln, entsprechend der Dokumentation docs.python.org/2/library/stdtypes.html#dict.keys aber es würde mich überraschen, wenn dieses Muster in einer seriösen Implementierung nicht so optimiert wäre, dass es sich in if 'key1' in dict: .

7 Stimmen

So habe ich endlich herausgefunden, warum viele meiner Python-Skripte so langsam waren :) :(. Das liegt daran, dass ich seit Jahren x in dict.keys() um nach Schlüsseln zu suchen. Und das geschah, weil die übliche Art, in Java über Schlüssel zu iterieren, ist for (Type k : dict.keySet()) diese Gewohnheit verursacht for k in dict.keys() sich natürlicher anfühlen als for k in dict (was in Bezug auf die Leistung immer noch in Ordnung sein sollte?), aber dann wird die Überprüfung der Schlüssel zu if k in dict.keys() auch, was ein Problem ist...

4 Stimmen

@EvgeniSergeev if k in dict_: prüft auf das Vorhandensein von k in den KEYS von dict_, so dass Sie immer noch nicht brauchen dict_.keys() . (Das hat mich gestört, denn es liest sich für mich wie ein Test für ein Wert in dict. Ist es aber nicht.)

67voto

David Berger Punkte 11589

Ich würde empfehlen, die setdefault Methode an. Es klingt so, als ob es alles tun wird, was Sie wollen.

>>> d = {'foo':'bar'}
>>> q = d.setdefault('foo','baz') #Do not override the existing key
>>> print q #The value takes what was originally in the dictionary
bar
>>> print d
{'foo': 'bar'}
>>> r = d.setdefault('baz',18) #baz was never in the dictionary
>>> print r #Now r has the value supplied above
18
>>> print d #The dictionary's been updated
{'foo': 'bar', 'baz': 18}

13 Stimmen

Was bedeutet setdefault mit der Frage des Auftraggebers zu tun haben?

23 Stimmen

@hughdbrown "Ich wollte testen, ob ein Schlüssel in einem Wörterbuch existiert, bevor ich den Wert für den Schlüssel aktualisiere." Manchmal enthalten Beiträge Code, der eine Flut von Antworten auf etwas erzeugt, das nicht ganz das ursprüngliche Ziel ist. Um das im ersten Satz genannte Ziel zu erreichen, ist setdefault die effektivste Methode, auch wenn es kein direkter Ersatz für den geposteten Beispielcode ist.

60voto

mafonya Punkte 2046

Ein Wörterbuch in Python hat eine get('key', default) Methode. Sie können also einfach einen Standardwert festlegen, falls es keinen Schlüssel gibt.

values = {...}
myValue = values.get('Key', None)

1 Stimmen

El get Das zweite Argument der Methode ist optional und lautet standardmäßig None wenn nicht enthalten, so values.get('Key', None) ist dasselbe wie values.get('Key') .

56voto

Charitoo Punkte 1634

Die Verwendung des Python ternärer Operator :

message = "blah" if 'key1' in my_dict else "booh"
print(message)

53voto

HungryArthur Punkte 928

Verwenden Sie EAFP (leichter um Vergebung zu bitten als um Erlaubnis):

try:
   blah = dict["mykey"]
   # key exists in dict
except KeyError:
   # key doesn't exist in dict

Siehe andere Stack Overflow-Beiträge:

23 Stimmen

Try/except kann teurer sein, wenn es wahrscheinlich ist, dass der Schlüssel oft nicht existiert. Aus dem Beitrag, auf den Sie sich bezogen haben: "[I]m Falle, dass Sie erwarten, dass das Ergebnis in 99 % der Fälle tatsächlich etwas Iterierbares enthält, würde ich den try/except-Ansatz verwenden. Es wird schneller sein, wenn Ausnahmen wirklich die Ausnahme sind. Wenn das Ergebnis in mehr als 50 % der Fälle keine ist, ist die Verwendung von if wahrscheinlich besser.[...][Eine if-Anweisung kostet Sie immer, die Einrichtung eines try/except-Blocks ist fast kostenlos. Aber wenn tatsächlich eine Exception auftritt, sind die Kosten viel höher." stackoverflow.com/a/1835844/1094092

33voto

prosti Punkte 34344

Prüfen, ob ein bestimmter Schlüssel bereits in einem Wörterbuch existiert

Um eine Vorstellung davon zu bekommen, wie das geht, sehen wir uns zunächst an, welche Methoden wir im Wörterbuch aufrufen können.

Hier sind die Methoden:

d={'clear':0, 'copy':1, 'fromkeys':2, 'get':3, 'items':4, 'keys':5, 'pop':6, 'popitem':7, 'setdefault':8, 'update':9, 'values':10}

Python Dictionary clear()        Removes all Items
Python Dictionary copy()         Returns Shallow Copy of a Dictionary
Python Dictionary fromkeys()     Creates dictionary from given sequence
Python Dictionary get()          Returns Value of The Key
Python Dictionary items()        Returns view of dictionary (key, value) pair
Python Dictionary keys()         Returns View Object of All Keys
Python Dictionary pop()          Removes and returns element having given key
Python Dictionary popitem()      Returns & Removes Element From Dictionary
Python Dictionary setdefault()   Inserts Key With a Value if Key is not Present
Python Dictionary update()       Updates the Dictionary
Python Dictionary values()       Returns view of all values in dictionary

Die brutale Methode, um zu prüfen, ob der Schlüssel bereits existiert, kann die get() método:

d.get("key")

Die beiden anderen interessant Methoden items() y keys() klingt nach zu viel Arbeit. Lassen Sie uns also untersuchen, ob get() ist die richtige Methode für uns. Wir haben unser Diktat d :

d= {'clear':0, 'copy':1, 'fromkeys':2, 'get':3, 'items':4, 'keys':5, 'pop':6, 'popitem':7, 'setdefault':8, 'update':9, 'values':10}

Der Druck zeigt, dass der Schlüssel, den wir nicht haben, zurückkommt None :

print(d.get('key')) #None
print(d.get('clear')) #0
print(d.get('copy')) #1

Auf diese Weise erhalten wir die Information, ob der Schlüssel vorhanden ist oder nicht. Wenn wir aber ein Diktat mit einem einzigen key:None :

d= {'key':None}
print(d.get('key')) #None
print(d.get('key2')) #None

Führend in diesem get() Methode ist nicht zuverlässig, wenn einige Werte möglicherweise None .

Diese Geschichte sollte ein glücklicheres Ende haben. Wenn wir die in Komparator:

print('key' in d) #True
print('key2' in d) #False

Wir erhalten die richtigen Ergebnisse.

Wir können den Python-Bytecode untersuchen:

import dis
dis.dis("'key' in d")
#   1           0 LOAD_CONST               0 ('key')
#               2 LOAD_NAME                0 (d)
#               4 COMPARE_OP               6 (in)
#               6 RETURN_VALUE

dis.dis("d.get('key2')")
#   1           0 LOAD_NAME                0 (d)
#               2 LOAD_METHOD              1 (get)
#               4 LOAD_CONST               0 ('key2')
#               6 CALL_METHOD              1
#               8 RETURN_VALUE

Dies zeigt, dass in ist nicht nur zuverlässiger, sondern auch schneller als get() .

0 Stimmen

.get() kann ein zweites Argument haben für default Wert, der verwendet werden könnte, um das Problem zu lösen, wenn key:None . Beispiel: d.get("key", False)

0 Stimmen

.get() ist der schnellste Weg. Eine weitere Möglichkeit ist die Zuweisung in einer try / except Block

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X