Python: устранение ошибки - KeyError: 'key_name'
Согласно официальной документации Python 3, ошибка KeyError возникает, когда ключ набора (словаря) не найден в наборе существующих ключей.
Эта ошибка встречается, когда мы пытаемся получить или удалить значение ключа из словаря, и этот ключ не существует в словаре.
rana@Brahma: ~$ python3
Python 3.5.2 (default, Jul 10 2019, 11:58:48)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> a = dict()
>>> a["key1"] = "value1"
>>> print(a["key2"])
Traceback (most recent call last):
File "", line 1, in
KeyError: 'key2'
>>>
Доступ к ключам словаря:
Для доступа к ключам словаря мы используем квадратные скобки [ ]
.
>>> gender = dict()
>>> gender["m"] = "Male"
>>> gender["f"] = "Female"
>>> gender["m"]
'Male'
>>>
Однако вышеуказанный способ, то есть использование квадратных скобок, имеет один недостаток. Если ключ не существует, мы получаем KeyError.
>>> gender["k"]
Traceback (most recent call last):
File "", line 1, in
KeyError: 'k'
>>>
Удаление несуществующего ключа:
>>> del gender["h"]
Traceback (most recent call last):
File "", line 1, in
KeyError: 'h'
>>>
Чтобы справиться с такими случаями, мы можем использовать один из следующих методов, основанных на сценарии.
- Используйте метод get()
Мы можем получить значение ключа из словаря, используя метод
get
. Если пара ключ-значение не существует для данного ключа в словаре, то возвращается None
, иначе возвращается значение, соответствующее этому ключу. Это рекомендуемый способ.
>>> gender.get("m")
'Male'
>>> gender.get("k")
>>>
>>> print(gender.get("k") is None)
True
>>>
Вы можете передать второй необязательный параметр в вызове get()
, который является значением, возвращаемым, если ключ не существует в словаре. Значением по умолчанию этого второго параметра является None
.
- проверить наличие ключа
Мы можем проверить, существует ли какой-либо конкретный ключ в словаре или нет, и затем на основании этого можно предпринять действия. Например:
gender = dict()
gender["m"] = "Male"
gender["f"] = "Female"
if "k" in gender:
print("Key k exists in gender")
else:
print("Key k doesn't exists in gender")
- Используйте try-exc
Если вы не используете или не хотите использовать метод get для доступа к ключам в словаре, используйте блок try-exc.
gender = dict()
gender["m"] = "Male"
gender["f"] = "Female"
try:
value = gender["k"]
except KeyError:
print("Key error. Do something else")
except Exception:
print("Some other error")
- Получить все ключи и перебрать словарь
Мы можем использовать метод keys()
, чтобы получить список всех ключей в словаре, а затем выполнить итерацию по этому списку и получить доступ к значениям в словаре.
gender = dict()
gender["m"] = "Male"
gender["f"] = "Female"
keys = gender.keys()
for key in keys:
print(gender[key])
- Или вы можете напрямую перебирать словарь для пар ключ и значение, используя метод items().
gender = dict()
gender["m"] = "Male"
gender["f"] = "Female"
for item in gender.items():
print(item[0], item[1])
Аналогично, для удаления значения ключа из словаря мы можем использовать метод pop()
вместо del.
Однако, в отличие от метода get()
, метод pop()
выбрасывает keyError
, если удаляемый ключ не существует и второй параметр не передается.
Таким образом, чтобы избежать ошибки KeyError в случае удаления ключа, мы должны передать значение по умолчанию, которое будет возвращено, если ключ не найден, в качестве второго параметра для pop()
>>>
>>> gender.pop("m")
'Male'
>>> gender.keys()
dict_keys(['f'])
>>> gender.pop("k")
Traceback (most recent call last):
File "", line 1, in
KeyError: 'k'
>>> gender.pop("k", None)
>>>