Python: уроки, справочник и задачи

Задачи по словарям Python с решениями и разбором

Раздел: Задачи на Python с решениями · Обновлено 31.10.2026

Задачи по словарям Python в этой подборке охватывают основные операции с типом dict: объединение, проверку ключей, создание из списков, удаление и подсчет. К каждой задаче есть условие, решение и объяснение, почему выбран именно такой способ. Попробуйте сначала решить задачу самостоятельно, а потом сверьтесь с кодом.

Задачи по словарям Python с решениями и разбором
Фото: Goatid / CC BY-SA 3.0, Wikimedia Commons
Содержание статьи
  1. Объединение двух словарей
    1. Оператор объединения
    2. Распаковка через две звездочки
    3. Методы copy() и update()
  2. Проверка наличия ключа
  3. Словарь из двух списков
  4. Удаление элемента из словаря
    1. Оператор del
    2. Метод pop()
  5. Дополнительные задачи
    1. Частота слов в тексте
    2. Поменять ключи и значения местами
    3. Группировка слов по первой букве
    4. Ключ с максимальным значением
  6. Частые вопросы
    1. Какой способ объединения словарей выбрать?
    2. Сохраняет ли словарь порядок ключей?
    3. Чем get() отличается от обращения в квадратных скобках?
    4. Может ли список быть ключом словаря?

Объединение двух словарей

Условие: даны словари dict_1 = {1: 'a', 2: 'b'} и dict_2 = {2: 'c', 4: 'd'}. Получите один словарь со всеми ключами. При совпадении ключа должно остаться значение из второго словаря. Задачу можно решить тремя способами, у каждого своя область применения.

Оператор объединения

Решение:

dict_1 = {1: 'a', 2: 'b'}
dict_2 = {2: 'c', 4: 'd'}
merged = dict_1 | dict_2
print(merged)  # {1: 'a', 2: 'c', 4: 'd'}

Оператор | появился в Python 3.9. Он создает новый словарь и не меняет исходные. Для ключа 2 победило значение правого операнда. Есть и вариант на месте: dict_1 |= dict_2 дописывает пары во dict_1.

Распаковка через две звездочки

Решение:

merged = {**dict_1, **dict_2}
print(merged)  # {1: 'a', 2: 'c', 4: 'd'}

Запись ** внутри фигурных скобок распаковывает пары словаря в новый литерал. Способ работает начиная с Python 3.5 и позволяет сразу добавить свои пары: {**dict_1, 'x': 0}.

Методы copy() и update()

Решение:

merged = dict_1.copy()
merged.update(dict_2)
print(merged)  # {1: 'a', 2: 'c', 4: 'd'}

Копия нужна, чтобы не испортить исходный словарь: update() меняет объект, у которого вызван. Порядок важен: если скопировать dict_2 и обновить его из dict_1, при совпадении ключей останутся значения первого словаря. Остальные методы описаны в статье про методы словаря.

Проверка наличия ключа

Условие: дан словарь {1: 'a', 2: 'b', 3: 'c'}. Проверьте, есть ли в нем ключ 2, и выведите сообщение.

Решение:

my_dict = {1: 'a', 2: 'b', 3: 'c'}
if 2 in my_dict:
    print('Ключ существует')
else:
    print('Ключ не найден')
# Ключ существует

Оператор in ищет только среди ключей и работает за постоянное время благодаря хеш-таблице. Чтобы проверить значение, пишут 'b' in my_dict.values(), но такой поиск перебирает все элементы. Если нужно сразу получить значение без риска KeyError, удобнее my_dict.get(5, 'нет'): метод вернет значение по умолчанию.

Словарь из двух списков

Условие: есть список номеров [1, 2, 3] и список языков ['python', 'c', 'c++']. Соберите словарь, где номер будет ключом, а язык значением.

Решение:

index = [1, 2, 3]
languages = ['python', 'c', 'c++']
dictionary = dict(zip(index, languages))
print(dictionary)  # {1: 'python', 2: 'c', 3: 'c++'}

Функция zip() выдает пары (1, 'python'), (2, 'c') и так далее, а dict() превращает последовательность пар в словарь. Если списки разной длины, zip() остановится на коротком, лишние элементы пропадут молча. С Python 3.10 можно передать strict=True, и тогда разная длина вызовет ValueError. Подробнее о параллельном переборе в статье про zip и map.

Удаление элемента из словаря

Условие: из словаря {31: 'a', 21: 'b', 14: 'c'} удалите пару с ключом 31. Покажите два способа и объясните разницу.

Оператор del

Решение:

my_dict = {31: 'a', 21: 'b', 14: 'c'}
del my_dict[31]
print(my_dict)  # {21: 'b', 14: 'c'}

del удаляет пару ключ-значение и ничего не возвращает. Если ключа нет, возникнет KeyError.

Метод pop()

Решение:

my_dict = {31: 'a', 21: 'b', 14: 'c'}
removed = my_dict.pop(31)
print(removed)   # a
print(my_dict)   # {21: 'b', 14: 'c'}
print(my_dict.pop(99, None))  # None, ошибки нет

pop() возвращает значение удаленного ключа. Второй аргумент задает значение по умолчанию на случай, если ключа нет, это безопасная замена конструкции if key in d: del d[key]. Удалять ключи во время перебора словаря в цикле for нельзя: Python выбросит RuntimeError. Перебирайте копию ключей: for k in list(d):.

Дополнительные задачи

Эти задачи сложнее и часто встречаются на собеседованиях для начинающих и в учебных курсах. Для их решения пригодятся генераторы словарей и методы get() и setdefault().

Частота слов в тексте

Условие: дана строка 'кот пес кот рыба пес кот'. Посчитайте, сколько раз встречается каждое слово.

Решение:

text = 'кот пес кот рыба пес кот'
counts = {}
for word in text.split():
    counts[word] = counts.get(word, 0) + 1
print(counts)  # {'кот': 3, 'пес': 2, 'рыба': 1}

get(word, 0) возвращает 0 для нового слова, поэтому не нужна отдельная проверка. Та же задача решается одной строкой через Counter из модуля collections: Counter(text.split()).

Поменять ключи и значения местами

Условие: дан словарь {'a': 1, 'b': 2, 'c': 3}. Получите словарь, где числа стали ключами, а буквы значениями.

Решение:

d = {'a': 1, 'b': 2, 'c': 3}
inverted = {value: key for key, value in d.items()}
print(inverted)  # {1: 'a', 2: 'b', 3: 'c'}

Способ корректен, только если значения уникальны и хешируемы. При повторяющихся значениях останется последний ключ, а список в качестве значения вызовет TypeError.

Группировка слов по первой букве

Условие: дан список ['кот', 'корова', 'дом', 'доска', 'сыр']. Соберите словарь, где ключ - первая буква, а значение - список слов на эту букву.

Решение:

words = ['кот', 'корова', 'дом', 'доска', 'сыр']
groups = {}
for w in words:
    groups.setdefault(w[0], []).append(w)
print(groups)
# {'к': ['кот', 'корова'], 'д': ['дом', 'доска'], 'с': ['сыр']}

setdefault() создает пустой список для новой буквы и возвращает уже существующий для знакомой. Альтернатива - defaultdict(list).

Ключ с максимальным значением

Условие: дан словарь с баллами {'Аня': 88, 'Борис': 95, 'Вера': 91}. Выведите имя ученика с лучшим результатом и список всех имен по убыванию баллов.

Решение:

scores = {'Аня': 88, 'Борис': 95, 'Вера': 91}
best = max(scores, key=scores.get)
print(best)  # Борис
ranking = sorted(scores, key=scores.get, reverse=True)
print(ranking)  # ['Борис', 'Вера', 'Аня']

Перебор словаря дает ключи, а key=scores.get заставляет max() и sorted() сравнивать их значения. Другие варианты описаны в материале о том, как отсортировать словарь.

Частые вопросы

Короткие ответы на вопросы, которые возникают при решении задач со словарями.

Какой способ объединения словарей выбрать?

На Python 3.9 и новее проще всего оператор |. Если нужно изменить существующий словарь, используйте update() или |=. Распаковка ** подходит для старых версий и для сборки словаря с дополнительными парами.

Сохраняет ли словарь порядок ключей?

Да, начиная с Python 3.7 порядок вставки гарантирован спецификацией языка. При объединении ключи первого словаря идут первыми, новые ключи второго добавляются в конец.

Чем get() отличается от обращения в квадратных скобках?

d[key] выбрасывает KeyError, если ключа нет. d.get(key) возвращает None или указанное значение по умолчанию.

Может ли список быть ключом словаря?

Нет, ключ должен быть хешируемым: подходят числа, строки, кортежи из неизменяемых элементов. Список вместо ключа вызовет TypeError: unhashable type: 'list', его заменяют кортежем.