Вопрос: Проверьте, существует ли данный ключ в словаре


Я хотел проверить, существует ли ключ в словаре перед обновлением значения для ключа. Я написал следующий код:

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

Я думаю, что это не лучший способ выполнить эту задачу. Есть ли лучший способ проверить ключ в словаре?


2100


источник


Ответы:


inпредназначен для проверки наличия ключа в dict,

d = dict()

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

Если вы хотите по умолчанию, вы всегда можете использовать dict.get():

d = dict()

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

... и если вы хотите всегда обеспечить значение по умолчанию для любого ключа, который вы можете использовать defaultdictиз collectionsмодуль, например:

from collections import defaultdict

d = defaultdict(lambda: 0)

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

... но в целом, inключевое слово - лучший способ сделать это.


2158



Вам не нужно вызывать ключи:

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

Это будет много Быстрее поскольку он использует хеширование словаря, а не выполняет линейный поиск, который вызывал бы ключи.


1047



Вы можете проверить наличие ключа в словаре, используя в ключевое слово:

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

Обычное использование для проверки наличия ключа в словаре перед его изменением - инициализировать значение по умолчанию (например, если ваши значения являются списками, например, и вы хотите убедиться, что существует пустой список, который вы можете добавить при вставке первого значения для ключа). В таких случаях вы можете найти collections.defaultdict()тип, представляющий интерес.

В более раннем коде вы также можете найти некоторые has_key(), устаревший метод проверки наличия ключей в словарях (просто используйте key_name in dict_name, вместо этого).


226



Вы можете сократить это:

if 'key1' in dict:
    ...

Однако это в лучшем случае косметическое улучшение. Почему вы считаете, что это не лучший способ?


72



Я бы рекомендовал использовать setdefaultвместо этого. Похоже, он сделает все, что захочет.

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

39



For additional info on speed execution of the accepted answer's proposed methods (10m loops):

  • 'key' in mydict elapsed time 1.07 sec
  • mydict.get('key') elapsed time 1.84 sec
  • mydefaultdict['key'] elapsed time 1.07 sec

Therefore using in or defaultdict are recommended against get.


33



For checking you can use has_key() method

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

If you want a value then you can use get() method

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

If you want a tuple or list or dictionary or any string as a default value as return value, then use get() method

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

14



Dictionary in python has a get('key', default) method. So you can just set a default value in case there is no key.

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

14