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

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

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

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

19 ответов


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 ключевое слово-лучший способ сделать это.


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

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

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


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

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, вместо).


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

if 'key1' in dict:
    ...

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


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

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

для получения дополнительной информации о скорости выполнения предложенных методов принятого ответа (петли 10m):

  • 'key' in mydict прошедшее время 1.07 сек
  • mydict.get('key') прошедшее время 1.84 сек
  • mydefaultdict['key'] прошедшее время 1.07 сек
используя in или defaultdict рекомендуется против get.

словарь в python имеет метод get ('key', default). Таким образом, вы можете просто установить значение по умолчанию, если нет ключа.

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

Как насчет использования EAFP (проще попросить прощения, чем разрешения):

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

см. другие сообщения SO:

использование try vs if в python или

Проверка наличия членов в Python


для проверки вы можете использовать has_key() метод

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

если вы хотите значение, то вы можете использовать get() метод

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

если вы хотите кортеж или список или словарь или любую строку в качестве значения по умолчанию в качестве возвращаемого значения, то используйте get() метод

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

использование троичного оператора:

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

просто добавление FYI к Крису. Б (лучший ответ):

d = defaultdict(int)

работает хорошо, причина в том, что вызов int() возвращает 0 что defaultdict делает за кулисами (при построении словаря), отсюда и название "Заводская функция" в документации.


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

  • если your_dict.has_key(ключ) удалено в Python 3
  • если ключ в your_dict
  • TRY/за исключением блока

что лучше зависит от 3 вещей:

  1. словарь "обычно имеет ключ" или "обычно не имеет ключа".
  2. вы намерены использовать такие условия, как если...еще...оператор elseif...еще?
  3. насколько велик словарь?

Подробнее:http://paltman.com/try-except-performance-in-python-a-simple-test/

использование try / block вместо " in " или "if":

try:
    my_dict_of_items[key_i_want_to_check]
except KeyError:
    # Do the operation you wanted to do for "key not present in dict".
else:
    # Do the operation you wanted to do with "key present in dict."

вы можете использовать метод has_key ():

if dict.has_key('xyz')==1:
    #update the value for the key
else:
    pass

или dict.get метод для установки значения по умолчанию, если не найдено:

mydict = {"a": 5}

print mydict["a"]            #prints 5
print mydict["b"]            #Throws KeyError: 'b'

print mydict.get("a", 0)     #prints 5
print mydict.get("b", 0)     #prints 0

print dict.get('key1', 'blah')

не будет печатать boo для значений в dict, но выполняет цель, печатая значение key1, чтобы подтвердить его существование.


словарь Python имеет метод, называемый __contains__. Этот метод вернет True, если словарь имеет ключ else возвращает False.

 >>> temp = {}

 >>> help(temp.__contains__)

Help on built-in function __contains__:

__contains__(key, /) method of builtins.dict instance
    True if D has a key k, else False.

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

d={1:'a',2:'b'}
try:
    needed=d[3]
    print(needed)
except:
    print("Key doesnt exist")

самый простой, если вы знаете, какой ключ (имя ключа) искать:

# suppose your dictionary is
my_dict = {'foo': 1, 'bar': 2}
# check if a key is there
if 'key' in my_dict.keys():   # it will evaluates to true if that key is present otherwise false.
    # do something

или вы также можете сделать просто так:

if 'key' in my_dict:   # it will evaluates to true if that key is present otherwise false.
    # do something

Я использую попробовать/за исключением; Если выбрасывается исключение, то ключа в словаре нет. пример:

st = 'sdhfjaks'
d = {}
try:
    print d['st']
except Exception, e:
    print 'Key not in the dictionary'

почему бы просто не использовать has_key() метод.

a = {}
a.has_key('b') => #False

a['b'] = 8
a.has_key('b') => #True