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

Содержание статьи
Объединение двух словарей
Условие: даны словари 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', его заменяют кортежем.