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

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

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

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

вопрос задан 21.10.2009
Mohan Gulati
12101 репутация

22 ответов


  • 2340 рейтинг

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

    ответ дан Chris B., с репутацией 43170, 21.10.2009
  • 1140 рейтинг

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

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

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

    ответ дан Jason Baker, с репутацией 101961, 21.10.2009
  • 233 рейтинг

    Вы можете проверить наличие ключа в словаре, используя ключевое слово 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 ).

    ответ дан Michael Aaron Safyan, с репутацией 74939, 21.10.2009
  • 76 рейтинг

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

     if 'key1' in dict:
        ...
     

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

    ответ дан Greg Hewgill, с репутацией 645957, 21.10.2009
  • 41 рейтинг

    Вместо этого я рекомендовал бы использовать метод 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}
     
    ответ дан David Berger, с репутацией 7726, 21.10.2009
  • 35 рейтинг

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

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

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

    ответ дан Wtower, с репутацией 9788, 29.05.2015
  • 24 рейтинг

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

     values = {...}
    myValue = values.get('Key', None)
     
    ответ дан mafonya, с репутацией 1373, 1.03.2017
  • 18 рейтинг

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

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

    Посмотреть другие сообщения SO:

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

    Проверка существования участника в Python

    ответ дан HungryArthur, с репутацией 510, 6.02.2014
  • 16 рейтинг

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

     message = "blah" if 'key1' in dict else "booh"
    print(message)
     
    ответ дан Charitoo, с репутацией 815, 18.08.2017
  • 16 рейтинг

    Для проверки вы можете использовать метод 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', [])
     
    ответ дан Debabrata, с репутацией 433, 10.09.2015
  • 13 рейтинг

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

     d = defaultdict(int)
     

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

    ответ дан Mauricio Morales, с репутацией 715, 19.05.2013
  • 12 рейтинг

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

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

    1. Словарь «обычно имеет ключ» или «обычно не имеет ключа».
    2. Вы собираетесь использовать такие условия, как if ... else ... elseif ... else?
    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."
     
    ответ дан Bishwas Mishra, с репутацией 541, 21.12.2016
  • 10 рейтинг

    Вы можете использовать метод 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
     
    ответ дан wan kenobi, с репутацией 167, 9.05.2013
  • 6 рейтинг

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

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

    ответ дан gounc86, с репутацией 83, 15.07.2015
  • 3 рейтинг

    Словарь 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.
     
    ответ дан Siva Gnanam, с репутацией 379, 26.04.2017
  • 2 рейтинг

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

     d={1:'a',2:'b'}
    try:
        needed=d[3]
        print(needed)
    except:
        print("Key doesnt exist")
     
    ответ дан Seenivasan, с репутацией 633, 9.12.2017
  • 0 рейтинг

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

     # 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
     
    ответ дан Tasneem Haider, с репутацией 58, 13.06.2016
  • 0 рейтинг

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

     st = 'sdhfjaks'
    d = {}
    try:
        print d['st']
    except Exception, e:
        print 'Key not in the dictionary'
     
    ответ дан Leonardo Maffei, с репутацией 61, 7.02.2018
  • -3 рейтинг

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

     a = {}
    a.has_key('b') => #False
    
    a['b'] = 8
    a.has_key('b') => #True
     
    ответ дан wmorris, с репутацией 6, 9.07.2018