Автор оригинала: Guest Contributor.
Вступление
Словарь (также известный как “карта”, ” хэш ” или “ассоциативный массив”)-это встроенный контейнер Python, который хранит элементы в виде пары ключ-значение .
Точно так же, как другие контейнеры имеют числовую индексацию, здесь мы используем ключи в качестве индексов. Ключи могут быть числовыми или строковыми. Однако никакая изменяемая последовательность или объект не может быть использована в качестве ключа, как список.
В этой статье мы рассмотрим как проверить, существует ли ключ в словаре на Python .
В примерах мы будем использовать этот fruits_dict
словарь:
fruits_dict = dict(apple= 1, mango= 3, banana= 4)
{'apple': 1, 'banana': 4, 'mango': 3}
Проверьте, существует ли Ключ с помощью оператора in
Самый простой способ проверить, существует ли ключ в словаре, – это использовать оператор in
. Это специальный оператор, используемый для оценки принадлежности значения.
Здесь он будет либо оценивать True
если ключ существует или to False
если его нет:
key = 'orange' if key in fruits_dict: print('Key Found') else: print('Key not found')
Теперь, поскольку у нас нет orange
в нашем словаре, это результат:
Key not found
Это предполагаемый и предпочтительный подход большинства разработчиков. Под капотом он использует функцию __contains__ ()
, чтобы проверить, является ли данный ключ в
словаре или нет.
Проверьте, существует ли ключ с помощью get()
Функция get()
принимает ключ и необязательное значение , которое будет возвращено, если ключ
не найден. По умолчанию это необязательное значение равно None
. Мы можем попробовать получить ключ, и если возвращаемое значение равно None
, это означает, что его нет в словаре:
key = 'orange' if fruits_dict.get(key) == None: print('Key not found') else: print('Key found')
Это приводит к:
Key not found
Проверьте, существует ли Ключ с помощью ключей()
Функция keys()
возвращает ключи из нашего словаря в виде последовательности:
fruits_dict.keys()
Эта последовательность содержит:
dict_keys(['apple', 'mango', 'banana'])
Используя эту последовательность, мы можем проверить, присутствует ли ключ. Вы можете сделать это через цикл или, еще лучше, использовать оператор in
:
key = 'orange' if key in fruits_dict.keys(): print('Key found') else: print('Key not found')
Это также приводит к:
Key not found
Проверьте, существует ли ключ с помощью has_key()
Вместо того чтобы вручную получать ключи и проверять наличие искомого значения, мы можем использовать функцию short-hand has_key()
:
key = 'orange' if fruits_dict.has_key(key): print('Key found') else: print('Key not found')
Он возвращает True
или False
, основываясь на наличии ключа. Этот код выводит:
Key not found
Обработка исключения “KeyError”
Интересный способ избежать проблем с несуществующим ключом или, другими словами, проверить, существует ли ключ в нашем словаре или нет,-это использовать предложение try
и except
для обработки исключения KeyError
.
Следующее исключение возникает всякий раз, когда нашей программе не удается найти соответствующий ключ в словаре.
Это простой, элегантный и быстрый способ обработки поиска ключей:
try: fruits_dict[key] except KeyError as err: print('Key not found')
Этот подход, хотя он может показаться неинтуитивным, на самом деле значительно быстрее, чем некоторые другие подходы, которые мы рассмотрели до сих пор.
Примечание: Обратите внимание, что исключения не должны использоваться для изменения потока кода или реализации логики. Они стреляют действительно быстро, но восстанавливаются от них очень медленно. Этот подход не должен быть предпочтительным по сравнению с другими подходами, когда это возможно.
Давайте сравним их производительность, чтобы получить лучшее представление о том, как быстро они могут выполняться.
Сравнение производительности
import timeit code_setup = """ key = 'orange' fruits_dict = dict(apple= 1, mango= 3, banana= 4) """ code_1 = """ if key in fruits_dict: # print('Key Found') pass else: # print('Key not found') pass """ code_2 = """ if fruits_dict.get(key): # print('Key found') pass else: # print('Key not found') pass """ code_3 = """ if fruits_dict.__contains__(key): # print('Key found') pass else: # print('Key not found') pass """ code_4 = """ try: # fruits_dict[key] pass except KeyError as err: # print('Key not found') pass """ code_5 = """ if key in fruits_dict.keys(): # print('Key found') pass else: # print('Key not found') pass """ print('Time of code_1: ', timeit.timeit(setup = code_setup , stmt= code_1, number= 10000000)) print('Time of code_2: ', timeit.timeit(setup = code_setup , stmt= code_2, number= 10000000)) print('Time of code_3: ', timeit.timeit(setup = code_setup , stmt= code_3, number= 10000000)) print('Time of code_4: ', timeit.timeit(setup = code_setup , stmt= code_4, number= 10000000)) print('Time of code_5: ', timeit.timeit(setup = code_setup , stmt= code_5, number= 10000000))
Это выводит:
Time of code_1: 0.2753713619995324 Time of code_2: 0.8163219139996727 Time of code_3: 0.5563563220002834 Time of code_4: 0.1561058730003424 Time of code_5: 0.7869278369998938
Наиболее популярный выбор и подход использования оператора in
довольно быстр, и это также предполагаемый подход для решения этой проблемы.
Вывод
В этой статье мы обсудили несколько способов проверить, существует ли ключ в нашем словаре или нет. Затем мы провели сравнение производительности.