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

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

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

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

Ответ 1

in это намеченный способ проверить существование ключа в dict.

d = dict()

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

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

d = dict()

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

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

from collections import defaultdict

d = defaultdict(int)

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

if 'key1' in dict:
    ...

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

Ответ 5

Дополнительная информация о скорости выполнения предложенных методов ответа (10-метровые петли):

  • 'key' in mydict прошедшее время 1.07 сек
  • mydict.get('key') прошедшее время 1,84 с
  • mydefaultdict['key'] прошедшее время 1.07 сек

Поэтому использование in или defaultdict рекомендуется для get.

Ответ 6

Вместо этого я рекомендовал бы использовать метод 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 been updated
{'foo': 'bar', 'baz': 18}

Ответ 7

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

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

Ответ 9

Используя тернарный оператор:

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

Ответ 10

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

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

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

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

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

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

Ответ 11

Способы получения результатов:

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

  • Словарь "обычно имеет ключ" или "обычно не имеет ключа".
  • Вы собираетесь использовать такие условия, как if... else... elseif... else?
  • Насколько велик словарь?

Подробнее: 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."

Ответ 12

Python 2 только: (и Python 2.7 поддерживает in уже)

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

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

Ответ 13

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

d = defaultdict(int)

Работает также; причина в том, что вызов int() возвращает 0, что является тем, что defaultdict делает за кулисами (при построении словаря), отсюда и название "Factory Function" в документации.

Ответ 14

Чтобы проверить, существует ли данный ключ в словаре, вы должны использовать любой из следующих подходов:

Первый подход (работает в Python 3):

def checkKey(dict, key):    
    if key in dict.keys(): 
        print("Key is here, ", end =" ") 
        print("value =", dict[key]) 
    else: 
        print("Key isn't present.") 

Давай проверим это:

dict = {'r': 30, 'g':59, 'b':11} 

key = 'b'
checkKey(dict, key) 

key = 'a'
checkKey(dict, key) 

Результат первого Approach One:

# Key is here, value = 11
# Key isn't present.

Подход второй (работа в Python 3):

def checkKey(dict, key):   
    if key in dict: 
        print("Key is here, ", end =" ") 
        print("value =", dict[key]) 
    else: 
        print("Key isn't present.") 

Давай проверим это тоже:

dict = {'x': 10, 'y':20, 'z':30} 

key = 'y'
checkKey(dict, key) 

key = 'u'
checkKey(dict, key) 

Результат Approach Two:

# Key is here, value = 20
# Key isn't present.

Подход третий (работа в Python 3):

def checkKey(dict, key):      
    if dict.has_key(key): 
        print "Key is here, value =", dict[key] 
    else: 
        print "Key isn't present."

Давай также проверим:

dict = {'u': 0, 'v':1, 'w':2} 

key = 'u'
checkKey(dict, key) 

key = 'm'
checkKey(dict, key)

Результат Approach Three:

# Key is here, value = 0
# Key isn't present.

Надеюсь это поможет.

Ответ 15

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

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

Ответ 16

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

Чтобы понять, как это сделать, мы сначала проверим, какие методы мы можем вызвать в словаре. Вот методы:

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

Жестоким методом проверки того, существует ли ключ, может быть метод get():

d.get("key")

Два других интересных метода items() и keys() звучат как слишком много работы. Итак, давайте рассмотрим, является ли get() правильным методом для нас. У нас есть Dict d:

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

Печать показывает, что ключ, которого у нас нет, вернет None:

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

Мы можем использовать это, чтобы получить информацию, если ключ присутствует или нет. Но учтите это, если мы создадим dict с одним key:None:

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

Указание на то, что метод get() не является надежным, если некоторые значения могут быть None. У этой истории должен быть более счастливый конец. Если мы используем in компараторе:

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

Мы получаем правильные результаты. Мы можем изучить байт-код Python:

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

Это показывает, что in сравнения оператора не только более надежным, но даже быстрее, чем get().

Ответ 17

Словарь 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.

Ответ 18

Совместное использование еще одного способа проверки наличия ключа с использованием логических операторов.

d = {'a': 1, 'b':2}
keys = 'abcd'

for k in keys:
    x = (k in d and 'blah') or 'boo'
    print(x) 

Это возвращает

>>> blah
>>> blah
>>> boo
>>> boo

объяснение

Сначала вы должны знать, что в Python 0, None или объекты с нулевой длиной имеют значение False. Все остальное оценивается как True. Булевы операции оцениваются слева направо и возвращают операнд не True или False.

Давайте посмотрим на пример:

>>> 'Some string' or 1/0 
'Some string'
>>>

Так как для параметра 'Some string' задано значение " True, остальная часть or не оценивается, и не возникает деление на ноль ошибок.

Но если мы переключаем порядок, сначала вычисляется 1/0, и возникает исключение:

>>> 1/0 or 'Some string'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
>>> 

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

(k in d and 'blah')

делает так же, как

if k in d:
    'blah'
else:
    False

Это уже возвращает правильный результат, если ключ существует, но мы хотим, чтобы он печатал 'boo', когда его нет. Итак, мы берем результат и /or с 'boo'

>>> False or 'boo'
'boo'
>>> 'blah' or 'boo'
'blah'
>>> 

Ответ 19

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

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

Ответ 20

Самый простой - узнать, какой ключ (имя ключа) должен искать:

# 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

Ответ 21

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

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

Ответ 22

Вы можете использовать цикл for для перебора словаря и получения имени ключа, который вы хотите найти в словаре, после этого проверьте, существует ли он или нет, используя условие if:

dic = {'first' : 12, 'second' : 123}
for each in dic:
    if each == 'second': 
        print('the key exists and the corresponding value can be updated in the dictionary')

Ответ 23

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

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

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