<div><img src="https://top-fwz1.mail.ru/counter?id=3548135;js=na" style="position:absolute;left:-9999px;" alt="Top.Mail.Ru" /></div>
Бесплатная миграция IT-инфраструктуры в облако

Как проверить наличие ключа в словаре Python

Миша Курушин
Миша Курушин
Технический писатель
12 ноября 2024 г.
21
6 минут чтения
Средний рейтинг статьи: 5

Словарь (dict) — это неупорядоченная структура данных в языке программирования Python, которая имеет вид «ключ — значение».

То есть любое значение, находящееся внутри словаря, извлекается с помощью явного указания ключа, который соответствует искомому значению. Обращение же к несуществующему ключу нарушает логику работы программы.

По этой причине необходимо выполнять проверку наличия ключа в словаре Python перед непосредственным обращением к его значению.

Язык программирования Python имеет множество встроенных методов для выполнения проверки наличия ключа в словаре, которые мы и рассмотрим в этой статье.

В этом руководстве используется интерпретатор Python версии 3.10.12, запущенный на операционной системе Ubuntu 22.04.

Оператор in + dict

Чаще всего, чтобы узнать, есть ли в словаре ключ, используется оператор in, обернутый в условие if/else:

some_dict = {'name': 'Виктор', 'age': 35, 'occupation': 'Just a guy...'}
some_key = 'name'

if some_key in some_dict:
	print('Ключ ' + some_key + ' удалось найти')
else:
	print('Ключ ' + some_key + ' не удалось найти')

Таким образом оператор in возвращает True, если ключ найден, или False, если указанного ключа нет.

vds

Оператор in + dict.keys()

Оператор in можно использовать не со словарем напрямую, а со списком его ключей, полученным с помощью функции dict.keys():

some_dict = {'name': 'Виктор', 'age': 35, 'occupation': 'Just a guy...'}
some_key = 'name'

if some_key in some_dict.keys():
	print('Ключ ' + some_key + ' удалось найти')
else:
	print('Ключ ' + some_key + ' не удалось найти')

Как видно, логика кода ничем не отличается от предыдущего примера, за исключением использования функции dict.keys() вместо экземпляра dict.

На первый взгляд такой подход может показаться бессмысленным. Однако в реальных программах могут возникать ситуации, когда необходимо обращение к именно к списку ключей словаря, а не к самому словарю.

Таким образом можно в очень лаконичной форме определить вхождение указанного ключа в словарь.

Функция dict.get()

Проверить наличие элемента в словаре можно, попытавшись извлечь его с помощью встроенного метода dict.get():

some_dict = {'name': 'Виктор', 'age': 35, 'occupation': 'Just a guy...'}
some_key = 'salary'

some_value = some_dict.get(some_key) # выполняем извлечение значения по ключу

# если вернувшееся значение равно None, то можно сделать вывод, что такого ключа еще не существует

if some_value is not None:
	print('Ключ ' + some_key + ' удалось найти и его значение равно "' + str(some_value) + '"')
else:
	print('Ключ ' + some_key + ' не удалось найти')

Как видно, обращение к несуществующему ключу через функцию dict.get(), в отличие от классических квадратных скобок, не вызовет ошибку, а лишь вернет пустое значение.

Однако, у этого способа есть недостаток. Может оказаться, что запрашиваемый ключ на самом деле существует внутри словаря, но его значение равно None:

some_dict = {'name': 'Виктор', 'age': 35, 'occupation': 'Just a guy...', 'salary': None}
some_key = 'salary' # запрашиваем ключ, значение которого изначально существует, но является пустым

some_value = some_dict.get(some_key) # получаем None и не можем понять, ключ не существует, или существует, но с пустым значением

print('Неизвестно, существует ли ключ ' + some_key + ' на самом деле')

Этот недостаток можно решить с помощью особенности метода dict.get() — возможности установить значение по умолчанию для несуществующего элемента.

some_dict1 = {'name': 'Виктор', 'age': 35, 'occupation': 'Just a guy...', 'salary': None}
some_dict2 = {'name': 'Виктор', 'age': 35, 'occupation': 'Just a guy...'}

some_key = 'salary'

some_value1 = some_dict1.get(some_key, "Зарплата не предусмотрена")
some_value2 = some_dict2.get(some_key, "Зарплата не предусмотрена")

print('При попытке доступа к ключу ' + some_key + ' получено значение "' + str(some_value1) + '"')
print('При попытке доступа к ключу ' + some_key + ' получено значение "' + str(some_value2) + '"')

В этом примере консольный вывод будет следующим:

При попытке доступа к ключу salary получено значение "None"
При попытке доступа к ключу salary получено значение "Зарплата не предусмотрена"

При этом если выполнять извлечение значения несуществующего ключа через квадратные скобки, то однозначно будет получена ошибка. В перспективе такую ошибку можно обработать с помощью исключения try/except, тем самым определив реальное существование ключа.

Исключение try/except

Проверить, существует ли ключ в словаре, можно с помощью обработки ошибок try/except — так сказать, прямо в «в лоб».

То есть, если при обращении к ключу возникает ошибка, значит, такого ключа нет, а если не возникает — значит, ключ есть.

Для реализации этого способа нужно обернуть обращение по ключу в блок обработки исключения try/except:

some_dict = {'name': 'Виктор', 'age': 35, 'occupation': 'Just a guy...'}
some_key = 'name'

try:
	some_value = some_dict[some_key]
	print('Ключ ' + some_key + ' удалось найти и его значение равно ' + some_value)
except some_error:
	print('Ключ ' + some_key + ' не удалось найти')

Такой способ проверки значения в словаре Python лучше всего использовать как запасной — в том случае, если любые другие способы не подходят.

Дело в том, что обработка исключений в языке программирования Python работает достаточно медленно, тем самым снижая производительность программы.

Тем не менее, проверка ключа через исключение try/except имеет право на существование.

Цикл for

В программах со сложной логикой может потребоваться явный поиск ключа в словаре. Особенно если такой поиск необходимо выполнить одновременно с изменением найденных значений.

В этом случае можно прибегнуть к ручному перебору словаря с помощью цикла for:

some_dict = {'name': 'Виктор', 'age': 35, 'occupation': 'Just a guy...'}
some_key = 'name'

isFound = False # переменная для хранения статуса поиска

# перебираем словарь
for found_key in some_dict:
	if found_key == some_key:
		isFound = True
		some_dict[found_key] = 'Витя' # изменяем найденное значение

if isFound:
	print('Ключ ' + some_key + ' удалось найти и его значение равно "' + some_dict[some_key] + '"')
else:
	print('Ключ ' + some_key + ' не удалось найти')

В этом примере все ключи словаря последовательно перебираются вручную, после чего изменяется само значение найденного ключа.

Таким образом можно писать более сложную логику, комбинируя и поиск ключа, и изменение его значения.

Цикл while

В некоторых случаях может быть полезно использовать цикл while вместо цикла for:

some_dict = {'name': 'Виктор', 'age': 35, 'occupation': 'Just a guy...'}
some_key = 'occupation'

isFound = False

some_keys = list(some_dict); # конвертируем ключи словаря в список

i = 0
while i < len(some_keys):
	if some_keys[i] == some_key:
		isFound = True
		some_dict[some_key] = 'Витя'
		break
	i += 1

if isFound:
	print('Ключ ' + some_key + ' удалось найти и его значение равно "' + some_dict[some_key] + '"')
else:
	print('Ключ ' + some_key + ' не удалось найти')

В этом случае общая логика приложения не меняется, но синтаксическая разница есть.

Разворачивайте проекты на Python<br>в облаке Timeweb Cloud

Заключение

Перед доступом к значению словаря необходимо убедиться, есть ли искомый элемент в этом самом словаре. В противном случае можно получить ошибку и вызвать сбой программы.

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

  • Оператор in
  • Функция dict.get()
  • Исключение try/except
  • Циклы for и while

Каждый конкретный случай требует своего способа проверки. В самом простом варианте используется оператор in. Когда логика приложения более сложная и требует выполнения дополнительных действий — задействуется цикл for или while.

Хотите внести свой вклад?
Участвуйте в нашей контент-программе за
вознаграждение или запросите нужную вам инструкцию
img-server
12 ноября 2024 г.
21
6 минут чтения
Средний рейтинг статьи: 5
Пока нет комментариев