Словари в Python: полное руководство с реальными примерами
Этот урок переведён с английского оригинала.Read in EnglishLeer en españolСообщить об ошибке в переводе
Откройте контакты в телефоне. Вы ищете человека по имени и получаете его номер телефона. Вы не ищете по позиции и не думаете: «мне нужен контакт номер 47». Вы ищете по имени.
Словарь в Python работает точно так же. Вместо того чтобы хранить элементы по позициям (как список), словарь хранит их в виде пар ключ-значение. Ключ служит именем, по которому вы ищете, а значение и есть то, что вы получаете в ответ.
В реальном программировании словари повсюду. Профили пользователей, настройки, JSON-данные от API, счётчики слов: всё это словари. В этом уроке вы освоите все основные операции со словарями.
Как создать словарь в Python
Словарь создаётся с помощью фигурных скобок {}, внутри которых записываются пары ключ-значение, где ключ отделён от значения двоеточием. Сами пары разделяются запятыми.
{'name': 'Alice', 'phone': '555-1234', 'email': 'alice@example.com'}Ключами обычно служат строки, но подойдёт любой неизменяемый тип: числа, кортежи или логические значения. Значения могут быть какими угодно: строками, числами, списками и даже другими словарями.
{'name': 'Bob', 'age': 16, 'grades': [85, 92, 78], 'active': True}
{}
{}Получение и изменение значений в словаре
Чтобы получить значение из словаря, укажите ключ в квадратных скобках. Чтобы изменить значение, присвойте этому ключу новое. Чтобы добавить новую пару, присвойте значение ключу, которого в словаре ещё нет.
Alice
25
26
{'name': 'Alice', 'age': 26, 'city': 'Boston', 'job': 'Engineer'}Not specified Alice
data = {'x': 10}
# Crashes with KeyError:
value = data['y']data = {'x': 10}
# Returns 0 if 'y' is missing:
value = data.get('y', 0)Основные методы словарей
У словарей есть несколько встроенных методов, которые упрощают работу с ними. Вот те, которыми вы будете пользоваться чаще всего.
['apple', 'banana', 'cherry']
[1.5, 0.75, 3.0]
[('apple', 1.5), ('banana', 0.75), ('cherry', 3.0)]3
{'apples': 5, 'oranges': 8}
{'apples': 10, 'oranges': 8, 'grapes': 12}Обратите внимание: update() и добавляет новые ключи, и перезаписывает существующие. В примере выше значение 'apples' изменилось с 5 на 10, а 'grapes' добавился как новый ключ.
Перебор словарей
Перебирать можно ключи словаря, его значения или и то и другое. Чаще всего перебирают items(), чтобы сразу получать и ключ, и значение.
Alice Bob Charlie --- 95 87 72 --- Alice: 95 Bob: 87 Charlie: 72
Как проверить, есть ли ключ в словаре
Прежде чем обращаться к ключу, часто нужно проверить, существует ли он. Ключевое слово in проверяет ключи, а не значения.
True False True Email: alice@example.com
Вложенные словари
Значением в словаре может быть другой словарь. Это называется вложенностью и позволяет описывать сложные структурированные данные, например класс учеников, у каждого из которых свой набор свойств.
A 15 Alice is 16 and got a A Bob is 15 and got a B Charlie is 16 and got a A
Чтобы получить вложенное значение, поставьте квадратные скобки друг за другом: сначала внешний ключ, затем внутренний. Вкладывать словари можно сколько угодно глубоко, но больше двух-трёх уровней читать уже трудно.
Частые ошибки при работе со словарями
New York
data = {'a': 1, 'b': 2, 'c': 3}
for key in data:
if data[key] < 2:
del data[key] # RuntimeError!data = {'a': 1, 'b': 2, 'c': 3}
for key in list(data.keys()):
if data[key] < 2:
del data[key] # Safe!
print(data) # {'b': 2, 'c': 3}Практические упражнения
Пора потренироваться! Упражнения идут от простых операций со словарями к более сложным приёмам.
Создайте словарь pet с такими парами ключ-значение:
'name': 'Buddy''species': 'dog''age': 5Затем выведите кличку питомца.
Ожидаемый вывод:
BuddyДан словарь, который описывает книгу. Выполните по порядку:
1. Измените 'year' на 2024
2. Добавьте новый ключ 'genre' со значением 'fiction'
3. Выведите весь словарь
Ожидаемый вывод:
{'title': 'The Great Adventure', 'author': 'Jane Smith', 'year': 2024, 'genre': 'fiction'}Дан словарь с профилем пользователя. С помощью метода .get() безопасно выведите номер телефона пользователя. Если ключа 'phone' нет, выведите 'No phone number'.
Ожидаемый вывод:
No phone numberПереберите словарь и выведите каждый фрукт и его цену в таком формате:
apple: $1.50
banana: $0.75
cherry: $3.00Цены должны выводиться ровно с двумя знаками после точки.
Внимательно прочитайте код и предскажите, что он выведет. Что происходит, когда в словаре есть повторяющиеся ключи?
Впишите вывод точно в том виде, в каком его напечатает Python.
Этот код пытается проверить, есть ли в словаре оценка 'A', но проверяет не то. Исправьте его, чтобы он выводил:
Someone got an A!Посчитайте, сколько раз каждое слово встречается в данном списке. Сохраните результаты в словаре word_counts, а затем выведите его.
Ожидаемый вывод:
{'hello': 3, 'world': 2, 'python': 1}Дан вложенный словарь с учениками. Переберите всех учеников и выведите имя каждого и его балл по математике в таком формате:
Alice: 95
Bob: 82
Charlie: 91Итоги: что вы узнали о словарях в Python
Отличная работа! Вот краткий обзор всего, что вы теперь знаете:
| Понятие | Что делает | Пример |
|---|---|---|
| Создание словаря | Хранит пары ключ-значение | d = {'name': 'Alice'} |
| Доступ по ключу | Получает значение | d['name'] |
| Безопасный доступ | Значение по умолчанию, если ключа нет | d.get('x', 0) |
| Добавление и изменение | Задаёт значение | d['age'] = 25 |
keys() | Все ключи | d.keys() |
values() | Все значения | d.values() |
items() | Кортежи ключ-значение | d.items() |
pop(key) | Удаляет и возвращает значение | d.pop('age') |
update() | Объединяет словари | d.update(other) |
in | Проверяет, есть ли ключ | 'name' in d |
| Вложенность | Словари внутри словарей | d['a']['b'] |
Словари входят в число важнейших структур данных в Python. Данные в формате JSON, ответы API, файлы настроек, счётчики: всё это держится на парах ключ-значение.
Что дальше?
В следующем уроке, [Включения в Python](/python/python-comprehensions), вы научитесь создавать списки, словари и множества одной изящной строкой кода.
Включения позволяют заменить многострочные циклы короткими однострочниками. Это одна из тех возможностей, благодаря которым код на Python выглядит таким чистым и выразительным.