Python
Словари в Python: dict на примерах
Словарь в Python хранит данные в формате ключ-значение. Он нужен, когда значение удобнее искать не по номеру в списке, а по понятному имени: name, price, city, status, id
Проще всего представить словарь как карточку. У карточки товара есть название, цена и наличие. У пользователя есть имя, email и город. У настройки есть ключ и выбранное значение. Если данные описывают один объект или быстрый доступ по имени поля, словарь обычно подходит лучше списка
Базовый пример
user = {
"name": "Анна",
"city": "Казань",
"age": 28,
}
print(user["name"])
print(user["city"])
Ключи в словаре должны быть уникальными. Если записать один и тот же ключ два раза, останется последнее значение
user = {"name": "Анна", "name": "Мария"}
print(user)
Как добавить и изменить значение
Добавление и изменение выглядят одинаково: обращаемся к ключу и присваиваем значение
product = {"title": "Кофе", "price": 790}
product["status"] = "в наличии"
product["price"] = 750
print(product)
Если ключа не было, он появится. Если ключ уже был, значение заменится. Это удобно, но требует внимания: случайная опечатка создаст новый ключ вместо изменения старого
Как безопасно читать данные
Прямое обращение user["email"] падает с KeyError, если ключа нет. Для необязательных полей удобнее get
user = {"name": "Анна"}
email = user.get("email", "email не указан")
print(email)
Такой прием часто нужен при работе с анкетами, настройками, ответами API и данными из CSV, где часть полей может отсутствовать
Перебор словаря
Чтобы пройти по парам ключ-значение, используйте items
user = {"name": "Анна", "city": "Казань", "age": 28}
for key, value in user.items():
print(key, value)
Если нужны только ключи, можно перебирать сам словарь. Если нужны только значения, есть values
print(list(user.keys()))
print(list(user.values()))
Практика: карточка товара
Соберите функцию, которая получает словарь товара и возвращает короткое описание. Если цены нет, покажите понятное сообщение
def describe_product(product):
title = product.get("title", "Без названия")
price = product.get("price")
if price is None:
return f"{title}: цена не указана"
return f"{title}: {price} руб."
print(describe_product({"title": "Кофе", "price": 790}))
print(describe_product({"title": "Чай"}))
В этом примере словарь удобен потому, что поля читаются по именам. Код не зависит от того, в каком порядке лежат данные
По этой теме полезно отдельно посмотреть Составьте еженедельное расписание занятий, чтобы расширить контекст и сравнить подходы
По этой теме полезно отдельно посмотреть Аннотации типов для декораторов в Python, чтобы расширить контекст и сравнить подходы
Частые ошибки
- читать отсутствующий ключ через квадратные скобки
- путать ключ и значение
- ждать, что в словаре могут быть два одинаковых ключа
- менять словарь внутри перебора без необходимости
- использовать список как ключ
Как проверить себя
Создайте словарь пользователя, добавьте email, измените город, выведите пары через items, прочитайте отсутствующий ключ через get. Потом повторите то же самое с товаром или задачей. Если вы можете объяснить, где ключ, где значение и что произойдет при отсутствующем поле, основа dict понятна
Словарь и список: когда что выбирать
Список хорош, когда важен порядок и нужно пройти все элементы подряд. Словарь хорош, когда у каждого значения есть имя или идентификатор. Если вы храните одного пользователя, удобнее словарь. Если храните много пользователей, обычно нужен список словарей
users = [
{"id": 1, "name": "Анна"},
{"id": 2, "name": "Илья"},
]
for user in users:
print(user["id"], user["name"])
Такой формат часто встречается в API, CSV после обработки, ботах, CRM, каталогах и парсерах. Список отвечает за набор записей, словарь — за поля одной записи
Мини-проект: настройки пользователя
Соберите словарь настроек и функцию, которая меняет только разрешенные поля
def update_settings(settings, key, value):
allowed = {"theme", "language", "notifications"}
if key not in allowed:
return settings
settings[key] = value
return settings
settings = {"theme": "light", "language": "ru"}
print(update_settings(settings, "theme", "dark"))
print(update_settings(settings, "password", "123"))
Этот пример показывает важную привычку: не каждый ключ из внешних данных нужно принимать. Если пользователь или файл передал лишнее поле, его можно спокойно игнорировать
Что проверить после примеров
Проверьте пустой словарь, отсутствующий ключ, изменение существующего поля и попытку добавить запрещенный ключ. После этого станет понятно, как словарь ведет себя в обычном случае и где может появиться ошибка
Итоговая тренировка: профиль и счетчик
Сделайте два маленьких упражнения подряд. Первое — карточка профиля. Второе — счетчик повторов. Так вы увидите два основных применения словаря: хранение полей одного объекта и накопление статистики
profile = {
"name": "Анна",
"city": "Казань",
}
profile["email"] = "anna@example.com"
profile["city"] = "Москва"
print(profile)
Теперь посчитайте, сколько раз встречается каждый город
cities = ["Казань", "Москва", "Казань", "Самара"]
counts = {}
for city in cities:
counts[city] = counts.get(city, 0) + 1
print(counts)
В первом упражнении ключи описывают поля профиля. Во втором ключи появляются из данных, а значения становятся счетчиками. Это разные сценарии, но в обоих случаях словарь помогает быстро получить нужное значение по ключу
Когда словарь становится неудобным
Словарь не заменяет все структуры данных. Если нужно сохранить строгий порядок действий, удобнее список. Если у каждого элемента много полей и нужна сложная логика, позже может понадобиться класс или отдельная модель. Если данные нужно хранить постоянно и искать по разным условиям, лучше подумать о базе данных
Для новичка нормальный путь такой: сначала словарь, потом список словарей, потом функции для обработки этих данных. Этого уже хватает для небольших скриптов, парсеров, ботов и учебных проектов
Проверьте себя на маленьком каталоге по словарям
Перед переходом дальше ответьте на несколько вопросов. Что будет, если прочитать отсутствующий ключ через квадратные скобки? Чем user["city"] отличается от user.get("city")? Почему у словаря не может быть двух одинаковых ключей? Когда лучше хранить список словарей, а не один большой словарь?
Если ответы получаются уверенно, попробуйте маленькое усложнение: сделайте список из трех пользователей и выведите только тех, у кого город равен Казань. В этом упражнении список отвечает за набор пользователей, а каждый словарь отвечает за поля одного пользователя. Такое сочетание встречается намного чаще, чем одиночный словарь сам по себе
Мини-проект: профиль пользователя и статистика
Словарь становится понятнее, когда в одном упражнении есть два разных сценария: описание одного объекта и подсчет повторов
profile = {"name": "Анна", "city": "Казань", "role": "student"}
profile["city"] = "Москва"
profile["email"] = "anna@example.com"
print(profile["name"])
print(profile.get("phone", "телефон не указан"))
cities = ["Казань", "Москва", "Казань", "Самара", "Москва"]
counts = {}
for city in cities:
counts[city] = counts.get(city, 0) + 1
print(counts)
Первый словарь хранит поля профиля. Второй собирает статистику из списка. Это два самых частых применения dict: карточка объекта и быстрый доступ к накопленным значениям
Как понять, что нужен именно словарь
Если вы постоянно спрашиваете «какое значение у поля name», «какая цена у товара», «сколько раз встретился город», словарь подходит. Если спрашиваете «какой элемент первый, второй, третий», чаще подходит список. В реальных задачах они часто работают вместе: список пользователей, где каждый пользователь — словарь