Работа со словарями в Python

Разработка на Python Просмотров: 2211

User Rating: 5 / 5

В предыдущих статьях мы смотрели с вами, как работать со списками и кортежами в Python. В Python есть ещё одна примечательная встроенная структура данных, которая часто используется во многих скриптах - это словари (англ. dictionaries). Во многих других языках программирования словари ещё принято называть ассоциативными массивами. Словари в Python не являются последовательностями, в отличие от списков, строк и кортежей. Они индексируются при помощи ключей. В качестве ключа может выступать любой неизменяемый тип, например, строки или числа. Кортежи могут использоваться как ключи, но только если они содержат исключительно строки, числа или другие кортежи. Если кортеж содержит любой изменяемый объект, то он прямо или косвенно не может быть использован в качестве ключа для словаря. Также в качестве ключей нельзя использовать и списки, поскольку они могут быть изменены - к примеру, при замене элемента по индексу или операциями нарезки, либо методами append() и extend(). Лучше всего представить себе словарь как набор пар ключ: значение с тем требованием, что ключи должны быть всегда уникальны в пределах одного словаря.

Вот как при помощи пары фигурных скобок { } создаётся пустой словарь:

# создали пустой словарь my_empty_dictionary
my_empty_dictionary = {}
# распечатали пустой словарь
print(my_empty_dictionary)

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

books_and_authors = {
    "Л. Н. Толстой" : "Война и мир",
    "Ф. М. Достоевский" : "Преступление и наказание",
    "А. С. Пушкин" : "Евгений Онегин" }

print(books_and_authors)

Точно так же, парами ключ: значение словарь и будет выведен на экран:

{'Л. Н. Толстой': 'Война и мир', 'Ф. М. Достоевский': 'Преступление и наказание', 'А. С. Пушкин': 'Евгений Онегин'}

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

process_phase = { 1 : "старт", 20 : "инициализация", 40 : "подготовка данных", 50 : "загрузка данных", 100 : "завершение" }
print(process_phase)

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

d = { 1 : 100, 2 : 200, 3 : 300, 4 : 400}
print(d)

А можно в качестве ключей использовать кортежи:

coordinates_dict = { (0, 0) : "начальная точка", (20, 0) : "20 по оси X", (0, 40) : "40 по оси Y" }
print(coordinates_dict)

Основными операциями над словарём являются сохранение значения в словарь с некоторым ключом и извлечение значения по заданному ключу. Также возможно удалить какую-то пару ключ: значение при помощи оператора del.

Получение значений словаря по ключу

Давайте посмотрим, как можно получать значения по ключу для приведённых выше примеров:

process_phase = { 1 : "старт", 20 : "инициализация", 40 : "подготовка данных", 50 : "загрузка данных", 100 : "завершение" }
print(process_phase[1])
print(process_phase[20])
print(process_phase[40])
print(process_phase[50])
print(process_phase[100])

Такой скрипт выведет на экран:

старт
инициализация
подготовка данных
загрузка данных
завершение

Попробуем получить значения по заданным ключам из словарей d и coordinates_dict:

d = { 1 : 100, 2 : 200, 3 : 300, 4 : 400}
print(d[1])
print(d[4])

coordinates_dict = { (0, 0) : "начальная точка", (20, 0) : "20 по оси X", (0, 40) : "40 по оси Y" }
print(coordinates_dict[(0, 0)])
print(coordinates_dict[(20, 0)])

Запуск такого скрипта выведет на экран консоли:

100
400
начальная точка
20 по оси X

Добавление новых элементов в словарь

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

d = { 1 : 100, 2 : 200, 3 : 300, 4 : 400}
print(d[1])
print(d[4])

d[5] = 500  # добавили в словарь новую пару 5: 500
d[6] = 600  # добавили в словарь новую пару 6: 600
print(d[5]) # вывели значение для ключа 5
print(d[6]) # вывели значение для ключа 6

coordinates_dict = { (0, 0) : "начальная точка", (20, 0) : "20 по оси X", (0, 40) : "40 по оси Y" }
print(coordinates_dict[(0, 0)])
print(coordinates_dict[(20, 0)])

coordinates_dict[(20, 20)] = "20 по оси X, 20 по оси Y"     # добавили в словарь новую пару (20, 20) : "20 по оси X, 20 по оси Y"
coordinates_dict[(-10, 35)] = "-10 по оси X, 35 по оси Y"   # добавили в словарь новую пару (-10, 35) : "-10 по оси X, 35 по оси Y"
print(coordinates_dict[(20, 20)]) # вывели значение для ключа (20, 20)   
print(coordinates_dict[(-10, 35)]) # вывели значение для ключа (-10, 35)

После запуска скрипта на экране консоли отобразится:

100
400
500
600
начальная точка
20 по оси X
20 по оси X, 20 по оси Y
-10 по оси X, 35 по оси Y

Замена значения в словаре для заданного ключа

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

d = { 1 : 100, 2 : 200, 3 : 300, 4 : 400}
print(d[1])
print(d[4])

d[1] = "сто" # заменили значение для ключа 1
d[2] = "двести" # заменили значение для ключа 2
print(d) # вывели на экран содержимое всего словаря

coordinates_dict = { (0, 0) : "начальная точка", (20, 0) : "20 по оси X", (0, 40) : "40 по оси Y" }
print(coordinates_dict[(0, 0)])
print(coordinates_dict[(20, 0)])
coordinates_dict[(0, 0)] = "0 по оси X, 0 по оси Y" # заменили значение для ключа (0, 0)
coordinates_dict[(20, 0)] = "координаты (двадцать, ноль)" # заменили значение для ключа (20, 0)
print(coordinates_dict) # вывели на экран содержимое всего словаря

После запуска скрипта на экране консоли отобразится:

100
400
{1: 'сто', 2: 'двести', 3: 300, 4: 400}
начальная точка
20 по оси X
{(0, 0): '0 по оси X, 0 по оси Y', (20, 0): 'координаты (двадцать, ноль)', (0, 40): '40 по оси Y'}

Удаление элементов из словаря

Для того, чтобы вообще удалить какой-то элемент из словаря, нужно использовать оператор del:

d = {1: 100, 2: 200, 3: 300, 4: 400}
print(f'd до удаления d[1]: {d}')
del d[1]
print(f'd после удаления d[1]: {d}')

coordinates_dict = {(0, 0): "начальная точка", (20, 0): "20 по оси X", (0, 40): "40 по оси Y"}
print(f'coordinates_dict до удаления coordinates_dict[(0, 0)]: {coordinates_dict}')
del coordinates_dict[(0, 0)]
print(f'coordinates_dict после удаления coordinates_dict[(0, 0)]: {coordinates_dict}')

Запустите этот скрипт и увидите на экране следующее:

d до удаления d[1]: {1: 100, 2: 200, 3: 300, 4: 400}
d после удаления d[1]: {2: 200, 3: 300, 4: 400}
coordinates_dict до удаления coordinates_dict[(0, 0)]: {(0, 0): 'начальная точка', (20, 0): '20 по оси X', (0, 40): '40 по оси Y'}
coordinates_dict после удаления coordinates_dict[(0, 0)]: {(20, 0): '20 по оси X', (0, 40): '40 по оси Y'}

Получение всех ключей словаря

Для получения всех ключей словаря можно использовать встроенную функцию list(), которая вернёт список всех ключей, используемых в словаре в порядке их добавления. Если вы желаете, чтобы этот список был отсортированным, то просто используйте вместо этого функцию sorted():

d = {1: 100, 2: 200, 3: 300, 4: 400}
print(f'd: {d}')
for dkey in list(d):
    print(dkey)

coordinates_dict = {(0, 0): "начальная точка", (20, 0): "20 по оси X", (0, 40): "40 по оси Y"}
print(f'coordinates_dict: {coordinates_dict}')
for coord_key in sorted(coordinates_dict):
    print(coord_key)

Результат работы приведённого выше скрипта:

d: {1: 100, 2: 200, 3: 300, 4: 400}
1
2
3
4
coordinates_dict: {(0, 0): 'начальная точка', (20, 0): '20 по оси X', (0, 40): '40 по оси Y'}
(0, 0)
(0, 40)
(20, 0)

Проверка наличия/отсутствия ключа в словаре - операторы in и not in

Чтобы быстро проверить, есть ли в словаре определённый ключ, используйте оператор in. Если требуется проверить, что ключа в словаре нет, то используйте not in. Примеры показаны ниже: 

d = {1: 100, 2: 200, 3: 300, 4: 400}
print(f'd: {d}')
print(f'2 есть в словаре d? : {2 in d}')
print(f'7 есть в словаре d? : {7 in d}')

print()

coordinates_dict = {(0, 0): "начальная точка", (20, 0): "20 по оси X", (0, 40): "40 по оси Y"}
print(f'coordinates_dict: {coordinates_dict}')
print(f'(50, 50) есть в словаре coordinates_dict? : {(50, 50) in coordinates_dict}')
print(f'(0, 40) есть в словаре coordinates_dict? : {(0, 40) in coordinates_dict}')
print(f'(1000, 2000) отсутствует в словаре coordinates_dict? : {(1000, 2000) not in coordinates_dict}')

Запустив скрипт, увидите на экране консоли следующее:

d: {1: 100, 2: 200, 3: 300, 4: 400}
2 есть в словаре d? : True
7 есть в словаре d? : False

coordinates_dict: {(0, 0): 'начальная точка', (20, 0): '20 по оси X', (0, 40): '40 по оси Y'}
(50, 50) есть в словаре coordinates_dict? : False
(0, 40) есть в словаре coordinates_dict? : True
(1000, 2000) есть в словаре coordinates_dict? : True

Другие полезные операции со словарями

Конструктор dict() строит словари прямо из последовательностей пар ключ: значение

print(dict([('раз', 1), ('два', 2), ('три', 3)])) # выведет на консоль: {'раз': 1, 'два': 2, 'три': 3}

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

print({x: x * 1000 for x in (10, 20, 30)})  # выведет на консоль: {10: 10000, 20: 20000, 30: 30000}

Ещё одной полезной фичей Python при создании нового словаря, которую хотелось бы рассмотреть, является создание словаря при помощи функции dict() и указания в ней пар с использованием именованных аргументов. Это используется для создания словарей, где ключами являются строки, но лишние кавычки набирать не очень хочется:

mydict = dict(раз=1, два=2, три=3)
print(mydict)   # выведет на консоль: {'раз': 1, 'два': 2, 'три': 3}

Такой вот удобный и быстрый способ создания словаря без ввода кавычек.

На этом всё, пробуйте разные методы работы со словарями и используйте эту крайне полезную структуру данных в ваших скриптах. Спасибо за внимание и удачи в разработке на Python!