Словари
Списки — удобный и самый популярный способ сохранить большое количество данных в одной переменной. Списки индексируют все хранящиеся в них элементы. Первый элемент, как мы помним, лежит по индексу 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
.
Например: