Проверьте, существует ли заданный ключ в словаре
Проблема: Проверка существования ключа в словаре
Я хочу проверить, существует ли ключ в словаре, перед тем как обновить его значение. Я написал следующий код:
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 в дальнейшем может потребовать изменений в вашем коде.
Итерация по словарям с использованием циклов 'for'
Создание словаря (dict) из отдельных списков ключей и значений
Преобразование списка словарей в DataFrame pandas
Почему использовать dict.get(key) вместо dict[key]?
Получить ключ по значению в словаре