26

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

14

Проблема: Проверка существования ключа в словаре

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

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

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

5 ответ(ов)

1

Вы можете сократить свой код до следующего:

if 'key1' in my_dict:
    ...

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

0

Я рекомендую использовать метод 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 вернёт его текущее значение, а если нет — добавит новый ключ со значением по умолчанию.

0

В Python у словарей есть метод get('key', default), который позволяет получить значение по ключу, при этом можно задать значение по умолчанию на случай, если указанный ключ отсутствует.

Например:

values = {...}
myValue = values.get('Key', None)

В данном случае, если ключ 'Key' не существует в словаре values, переменной myValue будет присвоено значение None. Вы можете заменить None на любое другое значение по умолчанию, которое вам нужно.

0

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

Вот методы, которые мы можем использовать:

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().

0

Только для 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 в дальнейшем может потребовать изменений в вашем коде.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь