Статью подготовили специалисты образовательного сервиса Zaochnik.
Словари в Python и работа с элементами словаря. Словари с различными типами значений
- 21 января 2025
- 10 минут
- 32
Словари (ассоциативные массивы) в Python
Стандартные списки (или массивы) в Python представляют собой коллекцию элементов, у каждого из которых имеется числовой индекс. Для доступа к элементам списка необходимо указать их индекс. Это позволяет легко находить элементы по определённому порядковому номеру, однако идентифицировать данные только по числовым индексам может быть не очень удобно. Например, в России маршруты поездов и авиарейсы имеют уникальные идентификаторы, состоящие из буквенно-цифровых комбинаций. В таких случаях гораздо удобнее использовать текстовые строки в качестве идентификаторов.
В Python существует структура данных, которая позволяет идентифицировать её элементы не по числовым индексу, а по произвольным ключам. Такая структура имеет название словарь или ассоциативный массив, и её обозначение - `dict`.
Для примера, создадим словарь под названием `Capitals`, в котором ключами будут названия стран, а значениями — названия их столиц. Такой подход позволяет быстро определять столицу по названию страны.
Каждый элемент в словаре состоит из пары: ключ и значение. В приведенном примере ключом служит название страны, а название столицы - значение. Ключ должен быть уникальным, то есть в словаре не может быть двух одинаковых ключей.
Словари распространены в повседневной жизни, например, бумажные словари — где ключом выступает слово-заголовок, а значением — статья, объясняющая значение этого слова. Чтобы получить доступ к определённой статье, необходимо знать соответствующий ключ.
Еще один пример использования словаря — телефонный справочник, в нем ключ - имя человека, а значение — его номер телефона.
Оба этих типа данных (описанные выше словарь и телефонный справочник) удобно организованы, так как позволяет быстро находить элементы по известному ключу. Однако, если известен только номер телефона (значение), то для его поиска надо будет просмотреть все записи.
Основная особенность ассоциативного массива заключается в его динамичности — в него можно добавлять новые элементы с произвольными ключами, и удалять созданные ранее (существующие). При этом размер используемой памяти является пропорциональным к количеству элементов в массиве. Доступ к элементам ассоциативных массивов несколько медленнее по сравнению с обычными массивами, но по-прежнему достаточно быстр.
В Python ключом в словаре может быть любой инвариантный (неизменяемый) тип данных: целые и действительные числа, строки, кортежи. Тем не менее в качестве ключа не может выступать множество, хотя frozenset (неизменяемая версия множества) подойдет. В роли значений в словаре можно использовать любой тип данных, включая изменяемые.
Когда целесообразно использовать словари
Словари следует применять в следующих ситуациях:
- Для подсчёта объектов: ключами будут сами объекты, а значениями — их количество.
- Для хранения данных, связанных с объектом: ключи — это сами объекты, а значения — сопутствующая информация. Например, для определения порядкового номера месяца можно создать словарь с ключами, представляющими названия месяцев.
- Для взаимосвязи между объектами: ключом будет один объект, а значением — соответствующий ему объект (например, "родитель-потомок").
- Если требуется массив с высокими индексами, но фактически используется не весь диапазон индексов, то ассоциативные массивы помогут сэкономить память.
Функции для создания словаря
Для создания пустого словаря можно использовать функцию `dict()` или пустую пару фигурных скобок `{}` (при этом стоит отметить, что фигурные скобки не могут использоваться для создания пустого множества).
В случае создания словаря с начальными значениями можно использовать несколько разных способов:
Первые два способа удобны для создания небольших словарей, где необходимо перечислить все их элементы. Второй - позволяет использовать именованные параметры функции `dict`, что подразумевает, что ключи могут быть только строками и должны соответствовать корректным идентификаторам. В третьем и четвертом методах можно создавать более крупные словари, методом передачи уже готовых списков, которые могут быть сгенерированы произвольным образом. В третьем же случае нужно передать списки кортежей, каждый из которых состоит из ключа и значения; в четвертом используется функция `zip`, которая объединяет два списка с одинаковой длиной.
Работа с элементами словаря
Основное действие с элементами словаря — получение значения по ключу, которое делается аналогично обращению к элементам списков: `A[key]`. Если ключ отсутствует, программой возникнет исключение KeyError.
Проверка наличия ключа в словаре выполняется с помощью операторов `in` и `not in`, аналогично множествам. При добавлении нового элемента в словарь необходимо всего лишь присвоить значение:
Чтобы удалить элемент из словаря, используется команда `del A[key]`, при этом возникнет исключение KeyError, если ключ отсутствует. Вот два безопасных метода удаления:
- Предварительная проверка наличия ключа:
- Обработка исключения:
Еще один способ удаления элемента — использовать метод `pop`: `A.pop(key)`, который возвращает значение элемента, который необходимо удалить. Если ключ отсутствует, будет вызвано исключение, но можно передать второй аргумент, чтобы получить значение по умолчанию, если ключ не найден: `A.pop(key, None)`.
Методы перебора элементов словаря
Перебирать ключи в словаре можно так:
Методы словаря возвращают представления его элементов.
Например, чтобы проверить, содержится ли значение `val` в словаре, можно использовать:
А для перебора, чтобы в переменных `key` и `val` были соответственно ключ и значение, можно использовать цикл:
Словари с различными типами значений
Словари могут хранить не только строки в качестве значений. Значениями могут быть объекты различных типов, включая целые числа, логические значения и даже другие словари. Более того, в одном словаре значения не обязаны быть однотипными. Ключи более ограничены, но могут быть смешанными по типам.
Пример хранения списков в словаре:
Как и с множествами и списками, функция `len()` возвращает количество элементов в словаре. Оператор `in` позволяет проверить существование конкретного ключа, например, 1000, который является одним из ключей в словаре `SUFFIXES`, и его значением является список из восьми строк. Можно также обращаться к элементам этого списка по индексу, который начинается с нуля.