8. Словари

  1. Структура. Словарь состоит из пар ключ-значение, которые разделяются запятыми. Внутри каждой пары значение отделяется от ключа двоеточием. Понять синтаксис проще всего на примере.
  2. Составная структура. Словарь — полезная составная структура данных, которая может хранить разные типы данных. По аналогии со списком ее можно называть последовательностью данных.
  3. Нет порядка. В отличие от списков и кортежей у словарей нет определенного порядка. Можно представить, что пары из ключа и значения перемешаны в мешке. И в нем не существует первого, второго или последнего элементов — они просто случайно существуют. Такая структура нацелена на увеличение производительности и предполагает доступ к значению по ключу.

Где используется?

Словари — распространенная структура данных в Python. Они используются в самых разных ситуациях. Вот некоторые из методов и функций словарей:

  • .keys() — используется для вывода ключей словаря.
  • .items() — используется для создания кортежей с ключами и значениями.
  • .get() — метод для получения значения по ключу.
  • .clear() — очистить словарь.
  • .copy() — скопировать весь словарь.
  • len() — получить длину словаря.
  • type() — узнать тип.
  • min() — получить ключ с минимальным значением.
  • max() — получить ключ с максимальным значением.

Рекомендации по работе со словарями

  1. Словари создаются с помощью фигурных скобок.
  2. Пары из ключа и значения разделяются запятыми.
  3. Ключи и значения разделяются между собой двоеточием
  4. Ключи в словаре могут быть только строками, целыми числами или числами с плавающей точкой. А вот значения могут быть любого типа
  5. Важно не забывать использовать кавычки для строки-ключа

Дальше пример словаря, где в качестве ключей используются строки, а в качестве значений — целые числа.


>>> p_ages = {"Андрей": 32, "Виктор": 29, "Максим": 18}
>>> print(p_ages)
{"Андрей": 32, "Виктор": 29, "Максим": 18}

Все строки в словаре заключены в кавычки. В следующем примере ключами уже являются целые числа, а значениями — строки.


>>> p_ages = {32: "Андрей", 29: "Виктор", 18: "Максим"}
>>> print(p_ages)
{32: "Андрей", 29: "Виктор", 18: "Максим"}

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

Так, для получения значения ключа «Виктор» нужно использовать такой синтаксис:


>>> p_ages = {"Андрей": 32, "Виктор": 29, "Максим": 18}
>>> p_ages["Максим"]
18
>>> p_ages["Андрей"]
32

Merge и Update

Начиная с версии Python 3.9, в языке появились новые операторы, которые облегчают процесс слияния словарей.

  1. Merge (|): этот оператор позволяет объединять два словаря с помощью одного символа |.
  2. Update (|=): с помощью такого оператора можно обновить первый словарь значением второго (с типом dict)

Вот основные отличия этих двух операторов:

  • «|» создает новый словарь, объединяя два, а «|=» обновляет первый словарь.
  • Оператор merge (|) упрощает процесс объединения словарей и работы с их значениями.
  • Оператор update (|=) используется для обновления словарей.

>>> dict1 = {"x": 1, "y":2}
>>> dict2 = {"a":11, "b":22}
>>> dict3 = dict1 | dict2
>>> print(dict3)
{"x":1, "y":2, "a":11, "b":22}

>>> dict1 = {"x": 1, "y":2}
>>> dict2 = {"a":11, "b":22}
>>> dict2 |= dict1
>>> print(dict2)
{"x":1, "y":2, "a":11, "b":22}

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

Функция №1: .keys()

.keys() — это удобный метод, который возвращает все ключи в словаре. Дальше посмотрим на пример с использованием метода keys.


>>> p_ages = {"Андрей": 32, "Виктор": 29, "Максим": 18}
>>> print(p_ages.keys())
dict_keys(['Андрей', 'Виктор', 'Максим'])

Функция №2: .items()

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


>>> p_ages = {"Андрей": 32, "Виктор": 29, "Максим": 18}
>>> a = p_ages.items()
>>> print(a)
dict_items([('Андрей', 32), ('Виктор', 29), ('Максим', 18)])

Метод .items() пригодится при необходимости использовать индексацию для доступа к данным.

Функция №3: .get()

.get() — полезный метод для получения значений из словаря по ключу. Получим доступ к возрасту с помощью метода .get().


>>> p_ages = {"Андрей": 32, "Виктор": 29, "Максим": 18}
>>> print(p_ages.get("Андрей"))
32

Функция №4: .clear()

Метод .clear() очищает словарь ото всех элементов.


>>> p_ages = {"Андрей": 32, "Виктор": 29, "Максим": 18}
>>> p_ages.clear()
>>> print(p_ages)
{}

Функция №5: .copy()

Метод .copy() возвращает копию словаря.


>>> p_ages = {"Андрей": 32, "Виктор": 29, "Максим": 18}
>>> print(p_ages.copy())
{"Андрей": 32, "Виктор": 29, "Максим": 18}

Функция №6: len()

Метод len() возвращает количество элементов словаря.


>>> p_ages = {"Андрей": 32, "Виктор": 29, "Максим": 18}
>>> print(len(p_ages))
3

Полезно знать

  1. Метод get() — более продвинутый по сравнению с подходом получения значения по ключу.
    Если добавить в метод второй параметр, то он вернет переданное значение в случае, когда ключ не будет найден. Если второй параметр не указывать, получите None.
  2. Если попробовать использовать новые операторы (| и |=) в старых версиях python, то вернется ошибка TypeError. Это касается в том числе и dict comprehension.

>>> p_ages = {"Андрей": 32, "Виктор": 29, "Максим": 18}
>>> print(p_ages.get("Михаил", "Не найдено"))
Не найдено
>>> print(p_ages.get("Андрей", "Не найдено"))
32

Задачи к уроку

Попробуйте решить задачи к этому уроку для закрепления знаний.

1. Выведите значение возраста из словаря person.

# данный код
person = {"name": "Kelly", "age":25, "city": "New york"}
# требуемый вывод:
# 25

2. Значениями словаря могут быть и списки. Допишите словарь с ключами BMW, ВАЗ, Tesla и списками из 3х моделей в качестве значений.

# данный код
models_data = {..., "Tesla": ["Modes S", ...]}
print(models_data["Tesla"][0])
# требуемый вывод:
# Modes S
  1. Исправьте ошибки в коде, что бы получить требуемый вывод.
# данный код
d1 = {"a": 100. "b": 200. "c":300}
d2 = {a: 300, b: 200, d:400}
print(d1["b"] == d2["b"])
# требуемый вывод:
# True

Файл со всем заданиями: https://gitlab.com/PythonRu/python-dlya-nachinayushih/-/blob/master/lesson_8.py.

Тест по словарям

Пройдите тест к этому уроку для проверки знаний. В тесте 5 вопросов, количество попыток неограниченно.

Тест по словарям

Как получить значение по ключу "marks" словаря student = {"name": "Emma", "class": 9, "marks": 75}
Как создать пустой словарь
Какие типы данных могут быть ключами словаря
Что выведет этот код?
p = {"name": "Mike", "salary": 8000}
print(p.get("age"))
Как получить "d":
sample = {"1":["a","b"], "2":["c","d"]}

Если нашли ошибку, опечатку или знаете как улучшить этот урок, пишите на почту. Ее можно найти внизу сайта.

Конец. Что делать дальше?

Это краткая серия знакомит с программированием на python. Если вы решали задачи, проходили тесты, справлялись с ошибками и не потеряли мотивацию стать разработчиком — стоит продолжать!

Вы можете учится основам, например на бесплатных курсах от Нетологии или GeekBrains. Учится и практиковаться на вебинарах Skillbox.

Для перехода на следующий уровень напишите свою программу: калькулятор, игру, api. Самостоятельно или с поддержкой менторов из Twitter и EPAM на программе Профессия Python-разработчик.

Появились вопросы? Задайте на Яндекс Кью

У блога есть сообщество на Кью >> Python Q <<. Там я и другие участники отвечаем на вопросы по python, программированию и контенту сайта.

Обучение Python и Data Science

Профессия Python-разработчик / Skillbox

Профессия Python-разработчик / Skillbox

7 313 2 925 ₽/мес.
Профессия Python Fullstack / Skillbox

Профессия Python Fullstack / Skillbox

6 569 2 627 ₽/мес.
Профессия Data Scientist / Skillbox

Профессия Data Scientist / Skillbox

9 187 3 675 ₽/мес.
Python-фреймворк на Django / Skillbox

Python-фреймворк на Django / Skillbox

818 ₽/мес.
Профессия DS: машинное обучение / Skillbox

Профессия DS: машинное обучение / Skillbox

6172 2469 ₽/мес.
Профессия DS: анализ данных / Skillbox

Профессия DS: анализ данных / Skillbox

6172 2469 ₽/мес.

Вам помогла эта статья? Поделитесь в соцсетях или блоге. Репосты помогают сайту развиться.

Александр эксперт Яндекс.Кью
Я создал этот блог в 2018 году, чтобы распространять полезные учебные материалы, документации и уроки на русском. На сайте опубликовано множество статей по основам python и библиотекам, уроков для начинающих и примеров написания программ.
Мои контакты: