2.6 Отображения \ Словари#

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

Создание словаря#

Для определения словаря, как и в случае с множествами, используется перечислиние в фигурных скобках. Единственное отличие, что через запятую перечисляются не просто значения, а именно пары, разделенные двоеточием:

new_dict = {"Russia": "Moscow", "USA": "Washington"}
print(new_dict)
{'Russia': 'Moscow', 'USA': 'Washington'}

Часто в рамках задач нужно будет не использовать готовые словари, а создавать пустые и заполнять их в процессе. Для создания пустого словаря можно пользоваться двумя вариантами:

empty_dict = dict()
empty_dict_2 = {}

print(empty_dict)
print(empty_dict_2)
{}
{}

Получение данных из словаря#

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

Для обращения по ключу есть несколько способов:

  1. указать нужный ключ в квадратных скобках - dict[key]

  2. использовать метод get - dict.get(key, value_if_no_key)

  3. использовать метод setdefault - dict.setdefault(key, create_value_if_no_key)

point = {"x": 10, "y": 12, "z": 5}
x = point["x"]  # такое обращение по ключу, которого не существует, вызовет ошибку.
y = point.get("y")  # обращение по ключу, которого не существует, вернет None. Безопасный способ
m = point.get("m", "ключ отсутствует")  # обращение по ключу, которого не существует, вернет второй аргумент
print(x, y, m)
10 12 ключ отсутствует
m = point.setdefault("m", 100)  # если ключа не существует, то он будет создан. После этого вернет значение по ключу
print(point, m)
{'x': 10, 'y': 12, 'z': 5, 'm': 100} 100

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

  • keys() - метод, возвращающий список ключей

  • values() - метод, возвращающий список значений

  • items() - метод, возвращающий пары значений (key, value)

point = {"x": 10, "y": 12, "z": 12}
keys = point.keys()  # на самом деле возвращает специальный тип данных dict_keys
print(keys)
print(list(keys))  # dict_keys можно преобразовать к обычному списку
dict_keys(['x', 'y', 'z'])
['x', 'y', 'z']
point = {"x": 10, "y": 12, "z": 12}
values = point.values()  # на самом деле возвращает специальный тип данных dict_values
print(values)
print(list(values))  # dict_values можно преобразовать к обычному списку
dict_values([10, 12, 12])
[10, 12, 12]
point = {"x": 10, "y": 12, "z": 12}
items = point.items()  # на самом деле возвращает специальный тип данных dict_items
print(items)
print(list(items))  # dict_items можно преобразовать к обычному списку
dict_items([('x', 10), ('y', 12), ('z', 12)])
[('x', 10), ('y', 12), ('z', 12)]

Изменение словаря#

Для обновления конкретного ключа можно использовать конструкцию, аналогичную тому, как изменяется значение по индексу в списке:

point = {"x": 10, "y": 12, "z": 5}
point["z"] = 100  # если ключ уже существовал, то обновит его значение
print(point)
{'x': 10, 'y': 12, 'z': 100}

Примечательно, что если при использовании такой инструкции указать несуществующий ключ, то ошибки не произойдет, а просто будет создан новый ключ:

point = {"x": 10, "y": 12, "z": 5}
point["t"] = 100  # если ключа нет в словаре, он будет создан
print(point)
{'x': 10, 'y': 12, 'z': 5, 't': 100}

Также один словарь можно обновлять с использованием другого словаря.
Так, для обновления словаря используется метод update, принимающий в качестве аргумента ещё один словарь. В результате команды a.update(b) - для совпадающих ключей значения будут обновлены, а ключи из b, отсутствующие в a, будут созданы с соответствующими значениями.

point = {"x": 10, "y": 12, "z": 12}
zm_point = {"z": 5, "m": 100}
point.update(zm_point)  # ключ z - обновится, ключ m - добавится
print(point)
{'x': 10, 'y': 12, 'z': 5, 'm': 100}

Методы словарей

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