Словари в Python: задачи с решениями
Словари в Python хранят данные парами ключ-значение и дают быстрый доступ по ключу, поэтому на них строится подсчет, группировка и поиск. Здесь собраны 30 задач на словари с готовыми решениями: от подсчета элементов списка до слияния, сортировки и фильтрации. Попробуйте сначала решить задачу сами, а потом сверьтесь с кодом.
Словари в python (dictionaries) - это структуры данных в языке программирования Python, которые позволяют хранить данные в виде пар ключ-значение. Ключи в словарях уникальны, и они используются для доступа к соответствующим значениям. Основные принципы работы со словарями и их применение.

Содержание статьи
- Задача 1: Подсчет уникальных элементов в списке
- Задача 2: Объединение двух словарей
- Задача 3: Получение ключа с максимальным значением
- Задача 4: Поиск ключа по значению
- Задача 5: Удаление элементов из словаря
- Задача 6: Проверка наличия ключа в словаре
- Задача 7: Поиск пересечения ключей в двух словарях
- Задача 8: Обновление значений в словаре по ключу
- Задача 9: Сортировка словаря по значениям
- Задача 10: Вычисление среднего значения из словаря
- Задача 11: Проверка идентичности словарей
- Задача 12: Получение подмножества ключей
- Задача 13: Объединение значений одинаковых ключей из списка словарей
- Задача 14: Группировка элементов списка по значению
- Задача 15: Поиск всех значений, удовлетворяющих условию
- Задача 16: Проверка наличия дубликатов в словаре
- Задача 17: Объединение списков значений одинаковых ключей в словаре
- Задача 18: Обратное формирование словаря
- Задача 19: Поиск ключа с наибольшим значением
- Задача 20: Слияние словарей с обновлением значений
- Задача 21: Фильтрация словаря по условию
- Задача 22: Объединение двух списков в словарь
- Задача 23: Проверка наличия подстроки в значениях словаря
- Задача 24: Объединение значений списков по ключу
- Задача 25: Вычисление разницы между значениями словаря
- Задача 26: Фильтрация списка словарей по условию
- Задача 27: Подсчет уникальных букв в слове
- Задача 28: Сравнение двух словарей
- Задача 29: Поиск ключа с минимальным значением
- Задача 30: Вычисление суммы значений словаря
- Приемы, которые пригодятся в задачах
- Дополнительные задачи
- Частые вопросы
Ниже представлен список задач по словарям. Решая практические задачи по словарям, вы закрепите свои теоретические знания на практике.
Задача 1: Подсчет уникальных элементов в списке
Требуется написать функцию, которая принимает на вход список элементов и возвращает словарь, содержащий уникальные элементы списка как ключи и количество их появлений в списке как значения.
Решение:
def count_unique_elements(input_list):
element_count = {}
for element in input_list:
if element in element_count:
element_count[element] += 1
else:
element_count[element] = 1
return element_count
Задача 2: Объединение двух словарей
Необходимо объединить два словаря в один, чтобы значения с одинаковыми ключами суммировались.
Решение:
def merge_dictionaries(dict1, dict2):
merged_dict = dict1.copy()
for key, value in dict2.items():
if key in merged_dict:
merged_dict[key] += value
else:
merged_dict[key] = value
return merged_dict
Задача 3: Получение ключа с максимальным значением
Требуется написать функцию, которая принимает словарь и возвращает ключ с максимальным значением.
Решение:
def key_with_max_value(input_dict):
max_key = max(input_dict, key=input_dict.get)
return max_key
Задача 4: Поиск ключа по значению
Напишите функцию, которая принимает на вход словарь и значение, а затем возвращает список ключей, соответствующих этому значению.
Решение:
def find_keys_by_value(input_dict, value):
keys_list = [key for key, val in input_dict.items() if val == value]
return keys_list
Задача 5: Удаление элементов из словаря
Реализуйте функцию, которая удаляет из словаря все пары ключ-значение, где значение меньше заданного порога.
Решение:
def remove_elements_below_threshold(input_dict, threshold):
keys_to_remove = [key for key, value in input_dict.items() if value < threshold]
for key in keys_to_remove:
del input_dict[key]
return input_dict
Задача 6: Проверка наличия ключа в словаре
Напишите функцию, которая принимает словарь и ключ, и возвращает True, если такой ключ уже существует в словаре, и False в противном случае.
Решение:
def check_key_existence(input_dict, key):
return key in input_dict
Задача 7: Поиск пересечения ключей в двух словарях
Напишите функцию, которая принимает на вход два словаря и возвращает список ключей, которые присутствуют в обоих словарях.
Решение:
def find_common_keys(dict1, dict2):
common_keys = [key for key in dict1.keys() if key in dict2]
return common_keys
Задача 8: Обновление значений в словаре по ключу
Реализуйте функцию, которая обновляет значение по заданному ключу в словаре. Если ключ не существует, он должен быть добавлен в словарь.
Решение:
def update_dictionary_value(input_dict, key, new_value):
input_dict[key] = new_value
return input_dict
Задача 9: Сортировка словаря по значениям
Напишите функцию, которая принимает на вход словарь и возвращает новый словарь, отсортированный по значениям (по возрастанию или убыванию).
Решение:
def sort_dictionary_by_values(input_dict, reverse=False):
sorted_dict = dict(sorted(input_dict.items(), key=lambda item: item[1], reverse=reverse))
return sorted_dict
Задача 10: Вычисление среднего значения из словаря
Напишите функцию, которая принимает на вход словарь, содержащий числовые значения, и возвращает среднее значение этих чисел.
Решение:
def calculate_average(input_dict):
if len(input_dict) == 0:
return 0
return sum(input_dict.values()) / len(input_dict)
Задача 11: Проверка идентичности словарей
Реализуйте функцию для проверки идентичности двух словарей, то есть проверку на то, что они содержат одни и те же ключи и значения.
Решение:
def check_dictionary_equality(dict1, dict2):
return dict1 == dict2
Задача 12: Получение подмножества ключей
Напишите функцию, которая принимает на вход словарь и список ключей, и возвращает новый словарь, содержащий только указанные ключи.
Решение:
def get_subset_of_keys(input_dict, keys_list):
subset_dict = {key: input_dict[key] for key in keys_list if key in input_dict}
return subset_dict
Задача 13: Объединение значений одинаковых ключей из списка словарей
Реализуйте функцию, которая принимает на вход список словарей и объединяет значения с одинаковыми ключами в новом словаре.
Решение:
def merge_values_with_same_keys(dict_list):
merged_dict = {}
for d in dict_list:
for key, value in d.items():
if key in merged_dict:
merged_dict[key] += value
else:
merged_dict[key] = value
return merged_dict
Задача 14: Группировка элементов списка по значению
Напишите функцию, которая принимает на вход список кортежей (ключ, значение) и возвращает словарь, в котором значения группируются по ключам.
Решение:
def group_elements_by_value(input_list):
grouped_dict = {}
for key, value in input_list:
if value in grouped_dict:
grouped_dict[value].append(key)
else:
grouped_dict[value] = [key]
return grouped_dict
Задача 15: Поиск всех значений, удовлетворяющих условию
Напишите функцию, которая принимает на вход словарь и условие, а затем возвращает список всех значений, удовлетворяющих данному условию.
Решение:
def find_values_by_condition(input_dict, condition):
values_list = [value for value in input_dict.values() if condition(value)]
return values_list
Задача 16: Проверка наличия дубликатов в словаре
Реализуйте функцию для проверки наличия дубликатов значений в словаре.
Решение:
def check_for_duplicates(input_dict):
values_set = set()
for value in input_dict.values():
if value in values_set:
return True
else:
values_set.add(value)
return False
Задача 17: Объединение списков значений одинаковых ключей в словаре
Напишите функцию, которая принимает на вход список словарей, значения которых являются списками, и объединяет списки с одинаковыми ключами в один новый словарь.
Решение:
def merge_lists_with_same_keys(dict_list):
merged_dict = {}
for d in dict_list:
for key, value_list in d.items():
merged_dict.setdefault(key, []).extend(value_list)
return merged_dict
Задача 18: Обратное формирование словаря
Напишите функцию, которая принимает на вход словарь и возвращает новый словарь, в котором ключи и значения поменяны местами.
Решение:
def reverse_dictionary(input_dict):
reversed_dict = {v: k for k, v in input_dict.items()}
return reversed_dict
Задача 19: Поиск ключа с наибольшим значением
Напишите функцию, которая принимает на вход словарь и возвращает ключ с наибольшим значением.
Решение:
def find_key_with_max_value(input_dict):
if not input_dict:
return None
max_value = max(input_dict.values())
key = [k for k, v in input_dict.items() if v == max_value][0]
return key
Задача 20: Слияние словарей с обновлением значений
Реализуйте функцию, которая принимает на вход несколько словарей и объединяет их, обновляя значения для одинаковых ключей.
Решение:
def merge_dictionaries(*dicts):
merged_dict = {}
for d in dicts:
for key, value in d.items():
if key in merged_dict:
merged_dict[key] += value
else:
merged_dict[key] = value
return merged_dict
Задача 21: Фильтрация словаря по условию
Напишите функцию, которая принимает на вход словарь и условие, а затем возвращает новый словарь, содержащий только те элементы, которые удовлетворяют условию.
Решение:
def filter_dictionary_by_condition(input_dict, condition):
filtered_dict = {k: v for k, v in input_dict.items() if condition(k, v)}
return filtered_dict
Задача 22: Объединение двух списков в словарь
Реализуйте функцию, которая принимает на вход два списка - один для ключей, другой для значений, и возвращает словарь, созданный из этих списков.
Решение:
def create_dictionary(keys, values):
combined_dict = dict(zip(keys, values))
return combined_dict
Задача 23: Проверка наличия подстроки в значениях словаря
Напишите функцию, которая принимает на вход словарь и подстроку, а затем возвращает список ключей, у которых значения содержат указанную подстроку.
Решение:
def find_keys_by_substring_value(input_dict, substring):
keys_with_substring = [key for key, value in input_dict.items() if substring in value]
return keys_with_substring
Задача 24: Объединение значений списков по ключу
Напишите функцию, которая принимает на вход список словарей и ключ, а затем возвращает словарь, содержащий объединенные значения всех списков по указанному ключу.
Решение:
def merge_values_by_key(dict_list, key):
merged_dict = {}
for d in dict_list:
if d[key] in merged_dict:
merged_dict[d[key]].extend(d.values())
else:
merged_dict[d[key]] = list(d.values())
return merged_dict
Задача 25: Вычисление разницы между значениями словаря
Реализуйте функцию, которая принимает на вход словарь с числовыми значениями и возвращает разницу между максимальным и минимальным значением.
Решение:
def calculate_difference_between_max_and_min(input_dict):
values = list(input_dict.values())
difference = max(values) - min(values)
return difference
Задача 26: Фильтрация списка словарей по условию
Напишите функцию, которая принимает на вход список словарей и условие, а затем возвращает новый список, содержащий только те словари, удовлетворяющие условию.
Решение:
def filter_list_of_dictionaries_by_condition(list_of_dicts, condition):
filtered_list = [d for d in list_of_dicts if condition(d)]
return filtered_list
Задача 27: Подсчет уникальных букв в слове
Напишите функцию, которая принимает на вход слово и возвращает словарь, содержащий уникальные буквы слова в качестве ключей и количество их появлений в слове в качестве значений.
Решение:
def count_unique_letters(word):
letter_count = {}
for letter in word:
if letter in letter_count:
letter_count[letter] += 1
else:
letter_count[letter] = 1
return letter_count
Задача 28: Сравнение двух словарей
Реализуйте функцию, которая принимает на вход два словаря и возвращает True, если они содержат одинаковые ключи и значения, и False в противном случае.
Решение:
def compare_dictionaries(dict1, dict2):
return dict1 == dict2
Задача 29: Поиск ключа с минимальным значением
Напишите функцию, которая принимает на вход словарь с числовыми значениями и возвращает ключ с минимальным значением.
Решение:
def find_key_with_min_value(input_dict):
if not input_dict:
return None
min_value = min(input_dict.values())
key = [k for k, v in input_dict.items() if v == min_value][0]
return key
Задача 30: Вычисление суммы значений словаря
Напишите функцию, которая принимает на вход словарь с числовыми значениями и возвращает сумму всех значений словаря.
Решение:
def calculate_sum_of_values(input_dict):
return sum(input_dict.values())
Приемы, которые пригодятся в задачах
Большинство решений ниже написаны на циклах, чтобы была видна логика. В рабочем коде те же операции часто короче. Перед практикой полезно держать под рукой методы словаря и несколько готовых инструментов из стандартной библиотеки.
| Задача | Короткий способ | Что происходит |
|---|---|---|
| Значение по умолчанию | d.get(key, 0) | Нет ключа - вернется 0, без KeyError |
| Подсчет элементов | Counter(items) | Словарь вида элемент: количество |
| Группировка в списки | d.setdefault(k, []).append(v) | Создает пустой список при первом обращении |
| Слияние с заменой | d1 | d2 | Новый словарь, значения из d2 побеждают (Python 3.9+) |
| Слияние с суммой | Counter(d1) + Counter(d2) | Складывает значения одинаковых ключей |
| Ключ с максимумом | max(d, key=d.get) | Сравнивает ключи по их значениям |
Так задачи 1, 2 и 27 решаются одной строкой через Counter из модуля collections. Учтите, что сложение двух Counter отбрасывает ключи с нулевыми и отрицательными итогами.
from collections import Counter, defaultdict
print(Counter("мама"))
# Counter({'м': 2, 'а': 2})
print(Counter({"a": 1, "b": 2}) + Counter({"b": 3}))
# Counter({'b': 5, 'a': 1})
groups = defaultdict(list)
for name, city in [("Анна", "Москва"), ("Олег", "Казань"), ("Ира", "Москва")]:
groups[city].append(name)
print(dict(groups))
# {'Москва': ['Анна', 'Ира'], 'Казань': ['Олег']}Дополнительные задачи
Три задачи посложнее для тех, кто прошел основной список. В них словарь сочетается со строками, вложенными структурами и сортировкой.
Задача 31: Частота слов в тексте
Напишите функцию, которая принимает строку и возвращает три самых частых слова с количеством повторов. Регистр и знаки препинания учитывать не нужно.
Решение:
import re
from collections import Counter
def top_words(text, n=3):
words = re.findall(r"\w+", text.lower())
return Counter(words).most_common(n)
print(top_words("Кот и пес. Кот спит, пес не спит, кот ест."))
# [('кот', 3), ('пес', 2), ('спит', 2)]Задача 32: Средний балл по ученикам
Дан список словарей вида {"name": ..., "score": ...}, одно имя может встречаться несколько раз. Верните словарь, где каждому имени соответствует средний балл.
Решение:
def average_scores(records):
scores = {}
for r in records:
scores.setdefault(r["name"], []).append(r["score"])
return {name: sum(s) / len(s) for name, s in scores.items()}
data = [{"name": "Оля", "score": 5}, {"name": "Петя", "score": 3}, {"name": "Оля", "score": 4}]
print(average_scores(data)) # {'Оля': 4.5, 'Петя': 3.0}Задача 33: Значение по пути во вложенном словаре
Напишите функцию, которая получает вложенный словарь и путь в виде строки "a.b.c" и возвращает значение по этому пути или None, если какого-то ключа нет.
Решение:
def get_by_path(data, path):
current = data
for key in path.split("."):
if not isinstance(current, dict) or key not in current:
return None
current = current[key]
return current
config = {"db": {"sqlite": {"file": "app.db"}}}
print(get_by_path(config, "db.sqlite.file")) # app.db
print(get_by_path(config, "db.mysql.host")) # None
Частые вопросы
Ответы на вопросы, которые чаще всего возникают при решении задач на словари.
Чем d[key] отличается от d.get(key)?
Обращение d[key] к отсутствующему ключу вызывает KeyError, а d.get(key) возвращает None или значение по умолчанию из второго аргумента. Квадратные скобки уместны, когда ключ точно есть, а его отсутствие означает ошибку в данных.
Какие объекты могут быть ключами словаря?
Только хешируемые: числа, строки, кортежи из неизменяемых элементов, frozenset. Список или другой словарь ключом быть не может, Python выдаст TypeError: unhashable type.
Сохраняет ли словарь порядок элементов?
Да, начиная с Python 3.7 словарь гарантированно хранит ключи в порядке добавления. Поэтому dict(sorted(d.items(), key=...)) из задачи 9 дает словарь в нужном порядке. Подробнее о вариантах сортировки в статье как отсортировать словарь.
Можно ли менять словарь во время перебора?
Добавлять и удалять ключи внутри цикла for key in d нельзя: будет RuntimeError. Поэтому в задаче 5 сначала собирается список ключей для удаления, а затем они удаляются отдельным циклом. Менять значения существующих ключей при переборе можно.
Где взять еще задачи на словари?
Продолжить практику можно в подборке задачи по словарям Python: там другие упражнения с решениями.