Проверьте, существует ли заданный ключ в словаре
Проблема: Проверка существования ключа в словаре
Я хочу проверить, существует ли ключ в словаре, перед тем как обновить его значение. Я написал следующий код:
if 'key1' in dict.keys():
print("blah")
else:
print("boo")
Однако мне кажется, что это не самый оптимальный способ для решения этой задачи. Есть ли более эффективный способ проверить наличие ключа в словаре?
5 ответ(ов)
Вы можете сократить свой код до следующего:
if 'key1' in my_dict:
...
Однако это, в лучшем случае, косметическое улучшение. Почему вы считаете, что это не лучший способ?
Я рекомендую использовать метод setdefault. Он, похоже, выполняет всё, что вам нужно.
>>> d = {'foo':'bar'}
>>> q = d.setdefault('foo','baz') # Не переопределяет существующий ключ
>>> print(q) # Значение остается тем, что было изначально в словаре
bar
>>> print(d)
{'foo': 'bar'}
>>> r = d.setdefault('baz',18) # baz никогда не был в словаре
>>> print(r) # Теперь r имеет указанное выше значение
18
>>> print(d) # Словарь был обновлён
{'foo': 'bar', 'baz': 18}
Таким образом, если ключ уже существует в словаре, setdefault вернёт его текущее значение, а если нет — добавит новый ключ со значением по умолчанию.
В Python у словарей есть метод get('key', default), который позволяет получить значение по ключу, при этом можно задать значение по умолчанию на случай, если указанный ключ отсутствует.
Например:
values = {...}
myValue = values.get('Key', None)
В данном случае, если ключ 'Key' не существует в словаре values, переменной myValue будет присвоено значение None. Вы можете заменить None на любое другое значение по умолчанию, которое вам нужно.
Чтобы проверить, существует ли данный ключ в словаре, сначала давайте посмотрим, какие методы доступны для словарей.
Вот методы, которые мы можем использовать:
d = {'clear': 0, 'copy': 1, 'fromkeys': 2, 'get': 3, 'items': 4, 'keys': 5, 'pop': 6, 'popitem': 7, 'setdefault': 8, 'update': 9, 'values': 10}
clear()— удаляет все элементы.copy()— возвращает поверхностную копию словаря.fromkeys()— создает словарь из данной последовательности.get()— возвращает значение по ключу.items()— возвращает представление словаря как пары (ключ, значение).keys()— возвращает представление всех ключей.pop()— удаляет и возвращает элемент с данным ключом.popitem()— возвращает и удаляет элемент из словаря.setdefault()— вставляет ключ с заданным значением, если ключ отсутствует.update()— обновляет словарь.values()— возвращает представление всех значений в словаре.
Самый жесткий способ проверить, существует ли ключ, — использовать метод get():
d.get("key")
Другие два метода items() и keys() требуют больше усилий для получения информации. Давайте проверим, является ли get() подходящим методом. У нас есть наш словарь d:
d = {'clear': 0, 'copy': 1, 'fromkeys': 2, 'get': 3, 'items': 4, 'keys': 5, 'pop': 6, 'popitem': 7, 'setdefault': 8, 'update': 9, 'values': 10}
Если мы используем get() для обращения к отсутствующему ключу, это вернет None:
print(d.get('key')) # None
print(d.get('clear')) # 0
print(d.get('copy')) # 1
Используя это, мы можем выяснить, существует ли ключ. Однако, если мы создадим словарь с единственным ключом, у которого значение — 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().
Только для Python 2: (в Python 2.7 оператор in уже поддерживается)
Вы можете использовать метод has_key():
if dict.has_key('xyz') == 1:
# Обновите значение для данного ключа
else:
pass
Однако стоит отметить, что использование метода has_key() считается устаревшим в Python 2.7 и более поздних версиях. Рекомендуется использовать оператор in, который более читаем и понятен:
if 'xyz' in dict:
# Обновите значение для данного ключа
else:
pass
Если вы пишете код для Python 2, имейте в виду, что переход на Python 3 в дальнейшем может потребовать изменений в вашем коде.
Преобразование списка словарей в DataFrame pandas
Почему использовать dict.get(key) вместо dict[key]?
Как преобразовать вложенный словарь Python в объект?
Ошибка: "'dict' объект не имеет метода 'iteritems'"
Есть ли питоний способ объединить два словаря (сложив значения для ключей, которые присутствуют в обоих)?