Проверить, если ключ уже существует в словаре
Я хотел проверить, существует ли ключ в словаре, прежде чем обновлять значение для ключа.
Я написал следующий код:
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}
для получения дополнительной информации о скорости выполнения предложенных методов принятый ответ (10м петель):
'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:
для проверки вы можете использовать
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', [])
просто FYI добавление к Крису. Б (лучший ответ):
d = defaultdict(int)работает хорошо, причина в том, что вызов
int()возвращает0чтоdefaultdictделает за кулисами (при построении словаря), отсюда и название "Заводская функция" в документации.
способы, которыми вы можете получить результаты:
- если your_dict.has_key(ключ) удалено в Python 3
- если ключ в your_dict
- TRY/за исключением блока
что лучше зависит от 3 вещей:
- имеет ли словарь "обычно имеет ключ" или "обычно не имеет ключа".
- вы собираетесь использовать такие условия, как если...еще...оператор elseif...еще?
- насколько велик словарь?
читать дальше: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.
хорошо.. Вы будете знакомы с тем, что поиск существования элемента в списке или данных означает прохождение всего (по крайней мере, для неупорядоченного списка, например, dict.поэтому вместо использования исключений и ошибок, которые возникают обычно, мы можем избежать этой сложности...
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
Comments