Проверьте, существует ли данный ключ в словаре
Я хотел проверить, существует ли ключ в словаре перед обновлением значения для ключа. Я написал следующий код:
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:
для проверки вы можете использовать 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.
хорошо.. Вам будет известно, что поиск существования элемента в списке или данных означает просмотр всего (по крайней мере, для неупорядоченного списка 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