Урок курса
Словарь: создание и базовые операции
Python для новичковДо этого момента мы работали с последовательностями — список хранит элементы по индексу, кортеж фиксирует неизменяемый набор. Но что если нужно хранить данные не по позиции, а по имени? Например, имя, возраст и город человека — не просто три значения в ряд, а три именованных поля. Именно для этого в Python есть словарь.
Словарь: структура, литерал и ключи
Словарь (dict) — встроенный тип Python для хранения пар ключ : значение. В отличие от списка, где элементы адресуются числовым индексом, в словаре каждое значение привязано к своему уникальному ключу.
Создать словарь проще всего литералом — фигурными скобками с парами через двоеточие:
person = {'name': 'Анна', 'age': 25, 'city': 'Москва'}
Здесь 'name', 'age' и 'city' — ключи, а 'Анна', 25 и 'Москва' — соответствующие им значения. Словарь можно читать как мини-базу данных: вместо «элемент с индексом 0» мы говорим «значение по ключу 'name'».
Что может быть ключом. Ключ обязан быть неизменяемым объектом: строка, число или кортеж подходят, список — нет. Это ограничение существует потому, что Python вычисляет хэш ключа для быстрого поиска, а хэш работает только для неизменяемых типов.
Что может быть значением. Любой объект Python: строка, число, список, другой словарь, функция — без ограничений.
Уникальность ключей. В одном словаре не может быть двух одинаковых ключей. Если написать:
d = {'x': 1, 'x': 2}
print(d) # {'x': 2}
Python не выдаст ошибку, но второй 'x' просто перезапишет первый. Это логично: ключ — это адрес, а у каждого адреса только одно значение.
Порядок вставки. Начиная с Python 3.7 словарь гарантирует, что элементы будут идти в том порядке, в котором вы их добавили. person выше всегда будет выводиться как name → age → city.
Пустой словарь. Создаётся просто:
empty = {}
print(type(empty)) # <class 'dict'>
И вот здесь важный момент: {} — это всегда словарь, не множество. Пустое множество создаётся только через set(), потому что для фигурных скобок без пар ключ:значение Python выбрал словарь как умолчание.
d = {} # dict
s = set() # set
print(type(d)) # <class 'dict'>
print(type(s)) # <class 'set'>
А вот {'a', 'b'} — уже множество, потому что элементы без двоеточий. {'a': 1, 'b': 2} — словарь, потому что есть пары. Граница проходит ровно по двоеточию.
Чтение значений: d[key] и KeyError
Чтобы получить значение из словаря, используют квадратные скобки — тот же синтаксис, что и у списков, только вместо числового индекса пишут ключ:
person = {'name': 'Анна', 'age': 25, 'city': 'Москва'}
print(person['name']) # Анна
print(person['age']) # 25
Python находит ключ в словаре и возвращает связанное с ним значение. Порядок поиска не зависит от размера словаря — доступ по ключу работает быстро вне зависимости от того, сколько пар в словаре.
Когда возникает KeyError. Если написать ключ, которого в словаре нет, Python выбросит исключение KeyError:
print(person['phone']) # KeyError: 'phone'
Сообщение об ошибке содержит имя отсутствующего ключа — это удобно для отладки. KeyError не означает, что со словарём что-то сломалось; это просто сигнал: «такого ключа здесь нет».
Важно понять, что Python не возвращает None и не пропускает ошибку молча — он останавливает выполнение программы. Это поведение намеренное: лучше упасть с понятным сообщением, чем продолжить работу с None там, где ожидалось реальное значение.
Как проверить ключ до обращения. Один из способов избежать KeyError — сначала убедиться, что ключ существует, с помощью оператора in:
if 'phone' in person:
print(person['phone'])
else:
print('Телефон не указан')
Оператор in для словаря проверяет именно ключи, а не значения. Выражение 'Анна' in person вернёт False, потому что 'Анна' — это значение, а не ключ.
Проверка через in перед d[key] работает, но требует двух строк. В следующей секции разберём метод get(), который решает ту же задачу компактнее.
Безопасное чтение через dict.get() и изменение пар
В предыдущей секции мы оставили подсказку: проверка через in перед d[key] работает, но многословна. Метод get() делает то же самое в одну строку.
dict.get(key, default)
Метод принимает ключ и необязательный аргумент default. Если ключ есть — возвращает значение. Если ключа нет — возвращает default, а не выбрасывает исключение.
person = {'name': 'Анна', 'age': 25, 'city': 'Москва'}
print(person.get('name')) # Анна
print(person.get('phone')) # None
print(person.get('phone', 'нет')) # нет
Когда default не указан, он равен None — Python не падает, просто возвращает «ничего». Когда указан, как 'нет' в третьем вызове, именно это значение вы получите вместо отсутствующего ключа.
get() удобен там, где отсутствие ключа — нормальная ситуация, а не ошибка. Например, пользователь мог не заполнить поле 'phone', и программа должна продолжить работу, а не упасть.
Добавление и изменение пар: d[key] = value
Для записи в словарь используется одно и то же присваивание — независимо от того, новый ключ или уже существующий:
person = {'name': 'Анна', 'age': 25}
# Изменяем существующий ключ
person['age'] = 26
# Добавляем новый ключ
person['city'] = 'Москва'
print(person) # {'name': 'Анна', 'age': 26, 'city': 'Москва'}
Python сам определяет, что делать: если ключ 'age' уже есть — перезапишет значение 25 на 26. Если ключа 'city' не было — создаст новую пару. Синтаксис одинаковый, поведение зависит от наличия ключа.
Это отличает словарь от списка: в список нельзя добавить элемент присваиванием lst[5] = 'x', если индекс 5 ещё не существует — будет IndexError. Словарь же спокойно создаёт новый ключ на лету.
Один нюанс: если нужно обновить числовое значение относительно текущего, пишут так:
person['age'] += 1 # читаем, прибавляем, записываем обратно
print(person['age']) # 27
Здесь person['age'] += 1 раскрывается в person['age'] = person['age'] + 1. Ключ 'age' должен существовать, иначе правая часть выдаст KeyError — именно тот случай, когда стоит заранее убедиться в наличии ключа или задать значение по умолчанию.
Удаление пар методом dict.pop() и полный цикл операций
Последняя базовая операция со словарём — удаление пары по ключу. Для этого есть метод pop().
dict.pop(key)
Метод удаляет пару с указанным ключом и возвращает удалённое значение:
person = {'name': 'Анна', 'age': 26, 'city': 'Москва'}
udалённый_город = person.pop('city')
print(удалённый_город) # Москва
print(person) # {'name': 'Анна', 'age': 26}
Возвращаемое значение — не мелочь: оно позволяет одновременно удалить ключ и сохранить его содержимое в переменную, если оно ещё нужно.
Если попытаться удалить ключ, которого нет, pop() выбросит KeyError — поведение такое же, как у d[key]. Чтобы этого избежать, методу можно передать второй аргумент — значение по умолчанию:
result = person.pop('phone', None)
print(result) # None — ключа нет, но ошибки тоже нет
С default-аргументом pop() работает безопасно: если ключ есть — удаляет и возвращает значение, если нет — возвращает default и ничего не трогает.
Сквозной пример: все четыре операции
Посмотрим, как создание, чтение, изменение и удаление работают вместе на одном словаре:
# 1. Создание
person = {'name': 'Анна', 'age': 25}
# 2. Чтение
print(person['name']) # Анна
print(person.get('phone', 'нет')) # нет
# 3. Изменение существующего ключа и добавление нового
person['age'] = 26
person['city'] = 'Москва'
print(person) # {'name': 'Анна', 'age': 26, 'city': 'Москва'}
# 4. Удаление
udалённый = person.pop('city')
print(удалённый) # Москва
print(person) # {'name': 'Анна', 'age': 26}
Здесь видно, что все операции используют один и тот же объект person и не конфликтуют между собой. Создание через литерал {}, доступ через [] или get(), запись через d[key] = value, удаление через pop() — это полный рабочий набор для большинства задач со словарём.
В следующем уроке словарь перестанет быть статичным объектом: научимся перебирать все его пары через items(), keys() и values(), а значения смогут быть не только строками и числами, но и вложенными списками.
Закрепите тему на задачах
Проверьте существующий и отсутствующий ключ. Выберите осмысленно между прямым доступом, get и проверкой in: запасное значение не должно скрыть ошибку данных.
Словарь Python: создать и обновить карточку товара
Откройте условие и решите задачу перед чтением следующей темы. В задачах на код проверяется программа, в тестовых заданиях — выбранный ответ. Для последовательного обучения вернитесь в программу бесплатного курса.
Задача 1
Дан словарь:
info = {'brand': 'Toyota', 'year': 2020, 'color': 'белый'}
Что вернёт выражение info['year']?
Задача 2
Посмотрите на код:
scores = {'Алиса': 90, 'Боб': 75}
print(scores['Виктор'])
Что произойдёт при выполнении?
Задача 3
Что выведет следующий код? Напишите вывод точно так, как он появится в терминале.
catalog = {'яблоко': 30, 'груша': 45}
catalog['банан'] = 20
catalog['яблоко'] = 35
print(catalog['банан'], catalog['яблоко'])
Задача 4
Программист хочет безопасно получить значение по ключу 'email' из словаря user, вернув строку 'не указан', если ключ отсутствует. Какой вариант решает задачу корректно?
Задача 5
Что создаёт выражение d = {} в Python?
Задача 6
Что выведет следующий код?
prices = {'хлеб': 50, 'молоко': 80}
prices['молоко'] = 90
deleted = prices.pop('хлеб')
print(deleted)
print(prices)
Запишите результаты двух вызовов print в одной строке, разделив их одним пробелом.
Задача 7
Посмотрите на код:
stock = {'ручка': 10, 'тетрадь': 5}
stock.pop('линейка')
Что произойдёт при выполнении этого кода?
Задача 8
Погода в городе и безопасный доступ к осадкам
В файле уже задан словарь weather.
Нужно сформировать две строки и сохранить их в переменные:
summary— строка видаКазань: 18°C;rain_status— значение для ключа'rain', но без ошибки: если такого ключа нет, нужно использовать строкуосадков нет.
Используйте обычное обращение по ключу там, где значение точно есть, и get() там, где ключ может отсутствовать.
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
Задача 9
Карточка инвентаря для склада
В файле нужно собрать карточку товара и вывести итоговые данные.
Сначала создайте словарь item = {'name': 'фонарик', 'count': 2}.
Затем:
- добавьте в словарь ключ
'category'со значением'туризм'; - измените количество фонариков так, чтобы оно стало
3; - удалите ключ
'name'методомpop()и сохраните удалённое значение в переменнуюremoved_name.
В конце программа должна сохранить в переменных:
removed_name— удалённое имя;item— обновлённый словарь;keys_count— количество ключей, которое осталось в словаре после удаления.
Ничего не выводите вручную. Используйте только операции со словарём, которые изучены в уроке.
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
Задачи к уроку
- Словарь Python: создать и обновить карточку товара
Создайте словарь, получите и обновите значения по ключам на примере инвентаря. Задача для начинающих с проверкой кода.
Продолжить с сохранением прогресса
Перейдите к уроку в учебном кабинете.
