Рубрики
Без рубрики

Python: Проверьте, существует ли ключ в словаре

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

Автор оригинала: 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 довольно быстр, и это также предполагаемый подход для решения этой проблемы.

Вывод

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