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», «какая цена у товара», «сколько раз встретился город», словарь подходит. Если спрашиваете «какой элемент первый, второй, третий», чаще подходит список. В реальных задачах они часто работают вместе: список пользователей, где каждый пользователь — словарь

Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные

Настройки cookie

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x