Frage Überprüfen Sie, ob ein bestimmter Schlüssel in einem Wörterbuch bereits existiert


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

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

Ich denke, das ist nicht der beste Weg, um diese Aufgabe zu erfüllen. Gibt es eine bessere Möglichkeit, einen Schlüssel im Wörterbuch zu testen?


2178
2017-10-21 19:05


Ursprung


Antworten:


in ist der beabsichtigte Weg, um auf die Existenz eines Schlüssels in einem zu testen dict.

d = dict()

for i in xrange(100):
    key = i % 10
    if key in d:
        d[key] += 1
    else:
        d[key] = 1

Wenn Sie einen Standard wollten, können Sie immer verwenden dict.get():

d = dict()

for i in xrange(100):
    key = i % 10
    d[key] = d.get(key, 0) + 1

... und wenn Sie immer einen Standardwert für einen beliebigen Schlüssel festlegen möchten, den Sie verwenden können defaultdict von dem collections Modul, so:

from collections import defaultdict

d = defaultdict(lambda: 0)

for i in xrange(100):
    d[i % 10] += 1

... aber im Allgemeinen, die in Stichwort ist der beste Weg, es zu tun.


2232
2017-10-21 19:10



Sie müssen die Schlüssel nicht anrufen:

if 'key1' in dict:
  print "blah"
else:
  print "boo"

Das wird viel schneller da es das Hashing des Wörterbuchs verwendet, im Gegensatz zu einer linearen Suche, die aufrufende Schlüssel tun würden.


1093
2017-10-21 19:06



Sie können das Vorhandensein eines Schlüssels in einem Wörterbuch testen, indem Sie die Taste drücken im Stichwort:

d = {'a': 1, 'b': 2}
'a' in d # <== evaluates to True
'c' in d # <== evaluates to False

Eine häufige Verwendung für das Überprüfen der Existenz eines Schlüssels in einem Wörterbuch vor der Mutation ist die Standardinitialisierung des Werts (z. B. wenn Ihre Werte beispielsweise Listen sind und Sie sicherstellen möchten, dass eine leere Liste vorhanden ist, an die Sie anhängen können wenn Sie den ersten Wert für einen Schlüssel eingeben). In solchen Fällen finden Sie möglicherweise die collections.defaultdict() Typ von Interesse sein.

In älterem Code finden Sie möglicherweise auch einige Anwendungen von has_key(), eine veraltete Methode zur Überprüfung der Existenz von Schlüsseln in Wörterbüchern (einfach verwenden key_name in dict_name, stattdessen).


226
2017-10-21 19:16



Sie können dies verkürzen:

if 'key1' in dict:
    ...

Dies ist jedoch bestenfalls eine kosmetische Verbesserung. Warum glaubst du, das ist nicht der beste Weg?


74
2017-10-21 19:06



Ich würde empfehlen, die setdefault Methode stattdessen. Es klingt, als würde es alles tun, was du willst.

>>> 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}

40
2017-10-21 19:07



Für zusätzliche Informationen über die Geschwindigkeit der vorgeschlagenen Methoden der vorgeschlagenen Antwort (10m Schleifen):

  • 'key' in mydict verstrichene Zeit 1,07 sek
  • mydict.get('key') verstrichene Zeit 1,84 sek
  • mydefaultdict['key'] verstrichene Zeit 1,07 sek

Daher verwenden in oder defaultdict werden empfohlen gegen get.


35
2018-05-29 11:06



Das Wörterbuch in Python hat eine Methode get ('key', default). Sie können also einen Standardwert für den Fall festlegen, dass kein Schlüssel vorhanden ist.

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

19
2018-03-01 09:03



Zur Überprüfung können Sie verwenden has_key() Methode

if dict.has_key('key1'):
   print "it is there"

Wenn Sie einen Wert möchten, können Sie verwenden get() Methode

a = dict.get('key1', expeced_type)

Wenn Sie ein Tupel, eine Liste oder ein Wörterbuch oder eine Zeichenfolge als Standardwert als Rückgabewert verwenden möchten, verwenden Sie get() Methode

a = dict.get('key1', {}).get('key2', [])

15
2017-09-10 18:37



Verwenden des ternären Operators:

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

14
2017-08-18 22:58



Was ist mit der Verwendung von EAFP (leichter um Vergebung bitten als Erlaubnis):

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

Siehe andere SO-Posts:

Verwenden Sie try vs if in Python oder

Überprüfen auf Member Existenz in Python


14
2018-02-06 16:08