Автор статьи

Статью подготовили специалисты образовательного сервиса Zaochnik.

Словари в Python и работа с элементами словаря. Словари с различными типами значений

Словари (ассоциативные массивы) в Python

Стандартные списки (или массивы) в Python представляют собой коллекцию элементов, у каждого из которых имеется числовой индекс. Для доступа к элементам списка необходимо указать их индекс. Это позволяет легко находить элементы по определённому порядковому номеру, однако идентифицировать данные только по числовым индексам может быть не очень удобно. Например, в России маршруты поездов и авиарейсы имеют уникальные идентификаторы, состоящие из буквенно-цифровых комбинаций. В таких случаях гораздо удобнее использовать текстовые строки в качестве идентификаторов.

В Python существует структура данных, которая позволяет идентифицировать её элементы не по числовым индексу, а по произвольным ключам. Такая структура имеет название словарь или ассоциативный массив, и её обозначение - `dict`.

Для примера, создадим словарь под названием `Capitals`, в котором ключами будут названия стран, а значениями — названия их столиц. Такой подход позволяет быстро определять столицу по названию страны.

Пример 1

```

# Создаем пустой словарь “Capitals”

Capitals = dict()

# Заполняем некоторыми значениями

Capitals['Russia'] = 'Moscow'

Capitals['Ukraine'] = 'Kiev'

Capitals['USA'] = 'Washington'

# Спросим, в какой стране живет пользователь

print('В какой стране вы живете?')

country = input()

# Проверяем, есть ли введенная страна в нашем словаре “Capitals”

if country in Capitals:

     # Если страна найдена - выводим её столицу

     print('Столица вашей страны:', Capitals[country])

else:

     # Если страны нет - запрашиваем название столицы и добавляем её в словарь

     print('Как называется столица вашей страны?')

     city = input()

     Capitals[country] = city

```

Каждый элемент в словаре состоит из пары: ключ и значение. В приведенном примере ключом служит название страны, а название столицы - значение. Ключ должен быть уникальным, то есть в словаре не может быть двух одинаковых ключей.

Словари распространены в повседневной жизни, например, бумажные словари — где ключом выступает слово-заголовок, а значением — статья, объясняющая значение этого слова. Чтобы получить доступ к определённой статье, необходимо знать соответствующий ключ.

Еще один пример использования словаря — телефонный справочник, в нем ключ - имя человека, а значение — его номер телефона.

Оба этих типа данных (описанные выше словарь и телефонный справочник) удобно организованы, так как позволяет быстро находить элементы по известному ключу. Однако, если известен только номер телефона (значение), то для его поиска надо будет просмотреть все записи.

Основная особенность ассоциативного массива заключается в его динамичности — в него можно добавлять новые элементы с произвольными ключами, и удалять созданные ранее (существующие). При этом размер используемой памяти является пропорциональным к количеству элементов в массиве. Доступ к элементам ассоциативных массивов несколько медленнее по сравнению с обычными массивами, но по-прежнему достаточно быстр.

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

Когда целесообразно использовать словари

Словари следует применять в следующих ситуациях:

  1. Для подсчёта объектов: ключами будут сами объекты, а значениями — их количество.
  2. Для хранения данных, связанных с объектом: ключи — это сами объекты, а значения — сопутствующая информация. Например, для определения порядкового номера месяца можно создать словарь с ключами, представляющими названия месяцев.
  3. Для взаимосвязи между объектами: ключом будет один объект, а значением — соответствующий ему объект (например, "родитель-потомок").
  4. Если требуется массив с высокими индексами, но фактически используется не весь диапазон индексов, то ассоциативные массивы помогут сэкономить память.

Функции для создания словаря

Для создания пустого словаря можно использовать функцию `dict()` или пустую пару фигурных скобок `{}` (при этом стоит отметить, что фигурные скобки не могут использоваться для создания пустого множества).

В случае создания словаря с начальными значениями можно использовать несколько разных способов:

Пример 2

```

  1. Capitals = {'Russia': 'Moscow', 'Ukraine': 'Kiev', 'USA': 'Washington'}
  2. Capitals = dict(Russia='Moscow', Ukraine='Kiev', USA='Washington')
  3. Capitals = dict([("Russia", "Moscow"), ("Ukraine", "Kiev"), ("USA", "Washington")])
  4. Capitals = dict(zip(["Russia", "Ukraine", "USA"], ["Moscow", "Kiev", "Washington"]))

```

Первые два способа удобны для создания небольших словарей, где необходимо перечислить все их элементы. Второй - позволяет использовать именованные параметры функции `dict`, что подразумевает, что ключи могут быть только строками и должны соответствовать корректным идентификаторам. В третьем и четвертом методах можно создавать более крупные словари, методом передачи уже готовых списков, которые могут быть сгенерированы произвольным образом. В третьем же случае нужно передать списки кортежей, каждый из которых состоит из ключа и значения; в четвертом используется функция `zip`, которая объединяет два списка с одинаковой длиной.

Работа с элементами словаря

Основное действие с элементами словаря — получение значения по ключу, которое делается аналогично обращению к элементам списков: `A[key]`. Если ключ отсутствует, программой возникнет исключение KeyError.

Примечание 1

Существует метод `get`: `A.get(key)`, который возвращает `None`, если ключ не найден, или же можно указать второе значение, `A.get(key, val)`, которое будет возвращено, если ключ отсутствует.

Проверка наличия ключа в словаре выполняется с помощью операторов `in` и `not in`, аналогично множествам. При добавлении нового элемента в словарь необходимо всего лишь присвоить значение:

Пример 3

```

A[key] = value

```

Чтобы удалить элемент из словаря, используется команда `del A[key]`, при этом возникнет исключение KeyError, если ключ отсутствует. Вот два безопасных метода удаления:

  • Предварительная проверка наличия ключа:
Пример 4

```

if key in A:

     del A[key]

```

  •  Обработка исключения:
Пример 5

```

try:

     del A[key]

except KeyError:

     pass

```

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

Методы перебора элементов словаря

Перебирать ключи в словаре можно так:

Пример 6

```

for key in A:

     print(key, A[key])

```

Методы словаря возвращают представления его элементов.

Примечание 2

Метод `keys` возвращает представление ключей, `values` — значения, а `items` — пары ключ-значение.

 Например, чтобы проверить, содержится ли значение `val` в словаре, можно использовать:

Пример 7

```

val in A.values()

```

 А для перебора, чтобы в переменных `key` и `val` были соответственно ключ и значение, можно использовать цикл:

Пример 8

```

for key, val in A.items():

     print(key, val)

```

Словари с различными типами значений

Словари могут хранить не только строки в качестве значений. Значениями могут быть объекты различных типов, включая целые числа, логические значения и даже другие словари. Более того, в одном словаре значения не обязаны быть однотипными. Ключи более ограничены, но могут быть смешанными по типам.

Пример хранения списков в словаре:

Пример 9

```

SUFFIXES = {

     1000: ['KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],

     1024: ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']

}

len(SUFFIXES) # 2

1000 in SUFFIXES # True

SUFFIXES[1000] # ['KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']

SUFFIXES[1024] # ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB']

SUFFIXES[1000][3] # 'TB'

```

Как и с множествами и списками, функция `len()` возвращает количество элементов в словаре. Оператор `in` позволяет проверить существование конкретного ключа, например, 1000, который является одним из ключей в словаре `SUFFIXES`, и его значением является список из восьми строк. Можно также обращаться к элементам этого списка по индексу, который начинается с нуля.

Навигация по статьям

Выполненные работы по программированию
  • Программирование

    НИР на тему Автоматизированое рабочее места специалиста по социальной работе

    • Вид работы:

      Отчёт по практике

    • Выполнена:

      25 февраля 2020

    • Стоимость:

      1 900 руб

    Заказать такую же работу
  • Программирование

    Сравнительный анализ Python и других языков программирования на примере одной из синтаксических конструкций.

    • Вид работы:

      Эссе

    • Выполнена:

      14 февраля 2020

    • Стоимость:

      1 400 руб

    Заказать такую же работу
  • Программирование

    Обеспечение защиты информации при использовании системы электронного документооборота

    • Вид работы:

      Реферат

    • Выполнена:

      29 декабря 2019

    • Стоимость:

      500 руб

    Заказать такую же работу
  • Программирование

    То, что происходит с Россией с 1991 года, назвать реформами никак нельзя. Это не что иное, как революция свер

    • Вид работы:

      Эссе

    • Выполнена:

      16 декабря 2019

    • Стоимость:

      400 руб

    Заказать такую же работу
  • Программирование

    Искусственный интеллект. Достижения и перспективы развития.

    • Вид работы:

      Эссе

    • Выполнена:

      11 декабря 2019

    • Стоимость:

      800 руб

    Заказать такую же работу
  • Программирование

    Айти. Заполнить дневник практики.

    • Вид работы:

      Отчёт по практике

    • Выполнена:

      9 декабря 2019

    • Стоимость:

      1 800 руб

    Заказать такую же работу