Словари
Списки — удобный и самый популярный способ сохранить большое количество данных в одной переменной. Списки индексируют все хранящиеся в них элементы. Первый элемент, как мы помним, лежит по индексу 0, второй — по индексу 1 и т. д. Такой способ хранения позволяет быстро обращаться к элементу списка, зная его индекс.
Представим, что мы делаем свою онлайн-энциклопедию об актерах мирового кино (наподобие Википедии). Для каждого актера нужно сохранить текст статьи о нем. Ее название — строка, состоящая из фамилии и имени актера. Как правильно хранить такие данные?
Можно создать список кортежей. Каждый кортеж будет состоять из двух строк — названия и текста статьи.
Со временем количество статей значительно вырастет. Чтобы найти нужную статью по названию, нам придется написать цикл for, который пройдет по всем элементам списка actors и найдет в нем кортеж, первый элемент которого равен искомому названию. В приведенном выше примере, чтобы найти статью об Эмме Уотсон, нам придется в цикле пройти мимо Джонни Деппа и Сильвестра Сталлоне. Угадать заранее, что статья об Эмме Уотсон лежит после них, не получится.
Корень этой проблемы в том, что списки индексируются целыми числами. Мы же хотим находить информацию не по числу, а по строке — названию статьи. Было бы здорово, если бы индексами могли быть не числа, а строки. В списках это невозможно, однако возможно в словарях!
Словарь (в Python он называется dict) — тип данных, позволяющий, как и список, хранить много данных. В отличие от списка, в словаре для каждого элемента можно самому определить «индекс», по которому он будет доступен. Этот индекс называется ключом.
Создание словаря
Вот пример создания словаря для энциклопедии об актерах мирового кино:
Элементы словаря перечисляются в фигурных скобках (как и элементы множества!) и разделяются запятой. До двоеточия указывается ключ, а после двоеточия — значение, доступное в словаре по этому ключу.
Пустой словарь можно создать двумя способами:
Вспомните, что создать пустое множество можно, только используя функцию set(). Теперь понятно, почему это так — пустые фигурные скобки зарезервированы для создания словаря.
Обращение к элементу словаря
После инициализации словаря мы можем быстро получать статью про конкретного актера:
Обращение к элементу словаря выглядит как обращение к элементу списка, только вместо целочисленного индекса используется ключ. В качестве ключа можно указать выражение: Python вычислит его значение, прежде чем обратится к искомому элементу.
Если ключа в словаре нет, возникнет ошибка:
Добавление и удаление элементов
Важная особенность словаря — его динамичность. Мы можем добавлять новые элементы, изменять их или удалять. Изменяются элементы точно так же, как в списках, только вместо целочисленного индекса в квадратных скобках указывается ключ:
Также в словари можно добавлять новые элементы и удалять существующие.
Добавление синтаксически выглядит так же, как и изменение:
Для удаления можно использовать инструкцию del (как и в списках):
Удалять элемент можно и по-другому:
Единственное отличие этого способа от вызова del — он возвращает удаленное значение. Можно написать так:
В переменную deleted_value положится значение, которое хранилось в словаре по ключу Джонни Депп. В остальном этот способ идентичен оператору del. В частности, если ключа Джонни Депп в словаре нет, возникнет ошибка KeyError.
Чтобы ошибка не появлялась, этому методу можно передать второй аргумент. Он будет возвращен, если указанного ключа в словаре нет. Это позволяет реализовать безопасное удаление элемента из словаря:
Если ключа Джонни Депп в словаре нет, в deleted_value попадет None.
Проверка наличия элемента в словаре
Оператор in позволяет проверить, есть ли ключ в словаре:
Проверить, что ключа нет, можно с помощью аналогичного оператора not in:
Методы словарей
Взять значение в словаре можно не только с помощью квадратных скобок, но и с помощью метода get:
Преимущество метода в том, что, кроме ключа, он может принимать и второй аргумент — значение, которое вернется, если заданного ключа нет:
С помощью метода .keys() можно получить список всех ключей словаря:
Есть и парный метод .values(), возвращающий все значения словаря:
Если вы хотите перебрать элементы словаря d так, чтобы в переменной key оказывался ключ, а в value — соответствующее ему значение, это можно сделать с помощью метода .items() и цикла for.
Например: