Код
#статьи

Вызов значений из словаря Python: методы .get() и .setdefault() вместо квадратных скобок

Вы всё ещё пользуетесь квадратными скобками? Тогда мы идём к вам.

Dana Moskvina / Skillbox Media

Словарь в Python — это набор из пар «ключ: значение». Основные его свойства:

  • В каждой паре ключ (key) указывает на значение (value).
  • Ключи уникальны, повторов нет. Значения могут быть одинаковыми.
  • В отличие от списка или кортежа, словарь не упорядочен, то есть нельзя указать, какая пара в нём идёт первой, а какая последней.

Ключ от значения отделяется двоеточием, а пары разделяются запятыми. Весь словарь заключён в фигурные скобки {}.

author = {
  "first_name": "Виктор",
  "last_name": "Пелевин",
  "username": "dao1962"
}

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

Работа со словарём подразумевает вызов хранимых в нём значений по ключу. И здесь есть несколько способов.

Обычный (не слишком хороший) способ

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

author = {
  "first_name": "Виктор",
  "last_name": "Пелевин",
  "username": "dao1962"
}

author['username']
>>> 'dao1962'

author['age']
>>> Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
	author['age']
  KeyError: 'age'

Если же такого ключа нет, то вернётся исключение KeyError. И это, надо сказать, довольно неприятно, особенно в случае с объёмными и часто изменяющимися данными.

Путей решения этой проблемы несколько:

  • Использовать конструкцию try / except (схожую с условным оператором if / else), которая будет обрабатывать KeyError и возвращать не само исключение, а что-то более удобное для работы — например, сообщение.
try:
    author['age']
except KeyError:
    print('Такого ключа нет')
>>> 'Такого ключа нет'
  • Использовать встроенную библиотеку collections, а конкретно структуру defaultdict из неё — расширение над обычным словарём, позволяющее устанавливать значения по умолчанию для запрошенных несуществующих ключей.

Но есть и третий способ, даже два. Словарь в Python поддерживает встроенные методы вызова значения .get() и .setdefault(), которые позволяют обойтись без обработки исключений и импорта библиотек. Их мы и рассмотрим.

Вызов с помощью .get()

Пожалуй, самый безопасный способ вызова значений из словаря. У него два параметра:

  • Первый (обязательный) — ключ, значение которого мы хотим вызвать.
  • Второй (опциональный) — значение, которое вернёт метод, если ключа в словаре не существует. По умолчанию оно равно None — его метод и вернёт.
author.get('first_name')
>>> 'Виктор'

author.get('age')  # ничего не происходит

print(author.get('age'))  # поэтому используем print
>>> None

author.get('age', 'Такого ключа в словаре нет')
>>> 'Такого ключа в словаре нет'

Если ключ в словаре существует, то вызов .get() ничем не отличается от вызова с помощью квадратных скобок. Если же ключа нет, то метод возвращает второй параметр — либо None, либо, например, строку с сообщением.

И не надо обрабатывать ошибки и исключения.

Вызов с помощью .setdefault()

Иногда может понадобиться не только защита от ошибки KeyError, но и исправление самого словаря. Для этого применяется метод .setdefault(), который по синтаксису и выводу похож на .get() и принимает те же два параметра: вызываемый ключ и его значение по умолчанию.

Обнаружив, что вызываемого ключа не существует, метод .setdefault():

  • сам создаёт ключ;
  • создаёт к нему в пару значение, заданное вами (по умолчанию — None);
  • добавляет получившуюся пару в словарь;
  • возвращает значение.

Если вы не указали второй параметр, он вернёт None, то есть ничего.

author.setdefault('middle_name')  # None - значит ничего

author  # добавился ключ 'middle_name' со значением None
>>> {
    'first_name': 'Виктор', 
    'last_name': 'Пелевин', 
    'username': 'dao1962', 
    'middle_name': None,
}

author.setdefault('book', 'Омон Ра')
>>> 'Омон Ра'

author
>>>  {
    'first_name': 'Виктор', 
    'last_name': 'Пелевин', 
    'username': 'dao1962', 
    'middle_name': None,
    'book': 'Омон Ра',
}

Обратите внимание, что этот метод не меняет значения у существующих ключей.

author.setdefault('first_name', 'Владимир')
>>> 'Виктор'

Что в итоге

Если вам не нужно изменять сам словарь, то пользуйтесь вызовом с помощью .get(). Если запрашиваемые ключи и значения отсутствуют в словаре и их нужно туда добавить, то подойдёт метод .setdefault(). Оба этих метода надёжнее, чем «школьный» вызов с помощью квадратных скобок.

Хотите узнать больше? На курсе «Профессия Python-разработчик» вы познакомитесь со всеми методами и инструментами Python, которые необходимы программисту для успешного трудоустройства. Приходите!


Изучайте IT на практике — бесплатно

Курсы за 2990 0 р.

Я не знаю, с чего начать
Научитесь: Профессия Python-разработчик Узнать больше
Понравилась статья?
Да

Пользуясь нашим сайтом, вы соглашаетесь с тем, что мы используем cookies 🍪

Ссылка скопирована