Урок курса

Словарь: создание и базовые операции

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() там, где ключ может отсутствовать.

РешениеPython

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

Отправьте решение, чтобы увидеть результаты тестов.

Задача 9

Карточка инвентаря для склада

В файле нужно собрать карточку товара и вывести итоговые данные.

Сначала создайте словарь item = {'name': 'фонарик', 'count': 2}.

Затем:

  • добавьте в словарь ключ 'category' со значением 'туризм';
  • измените количество фонариков так, чтобы оно стало 3;
  • удалите ключ 'name' методом pop() и сохраните удалённое значение в переменную removed_name.

В конце программа должна сохранить в переменных:

  • removed_name — удалённое имя;
  • item — обновлённый словарь;
  • keys_count — количество ключей, которое осталось в словаре после удаления.

Ничего не выводите вручную. Используйте только операции со словарём, которые изучены в уроке.

РешениеPython

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

Отправьте решение, чтобы увидеть результаты тестов.

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

Все задачи курса →

Продолжить с сохранением прогресса

Перейдите к уроку в учебном кабинете.

Перейти к интерактивному уроку