diff --git a/README.md b/README.md index db5a50b4..ed91bda5 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,11 @@ 4. Найденная в соответствии с условием задачи категория должна выводиться в изначальном наименовании, приведенном в файле с входными данными. Если таких категорий несколько, то на вывод они все подаются в алфавитном порядке. ## Автор решения - +Середа Даниил Вадимович marvolo04@mail.ru ## Описание реализации - +Для работы с файлом используется функция find_pop_cats_in_file, которая выгружает содержимое JSON-файла и передаёт его в функцию find_pop_cats. Функция find_pop_cats используется для анализа списка корзин. Для пустого списка функция сразу возвращает JSON с пустым словарём. Если список не пуст, то создаётся объект Счётчик (по сути - словарь, но дополнен методами для удобной работы с подсчётом объектов). Далее циклом for перебираются заказы из списка. Дата заказа проверяется функцией check_date. Если дата не предновогодняя, цикл переходит к следующему заказу. Если дата предновогодняя, то тело цикла выполняется дальше. Для каждого предмета в заказе в словарь записывается соответствие Id категории и её имени, а к счётчику, связанному с id, прибавляется 1. После перебора всех заказов находится максимальное значение счётчика, и в список pop_cats делается выборка всех имён категорий, счётчики id которых принимают это значение. Полученный список сортируется и вставляется в JSON в соответствии с условием. ## Инструкция по сборке и запуску решения +Файл программы main.py и файл input.json должны находиться в одной директории. Для запуска необходимо: +1) открыть терминал +2) перейти в директорию с файлами +3) ввести "python3 main.py" diff --git a/main.py b/main.py new file mode 100644 index 00000000..fbb5dde9 --- /dev/null +++ b/main.py @@ -0,0 +1,55 @@ +import json +from collections import Counter +from datetime import datetime + +DATE_FORMAT = "%Y-%m-%dT%H:%M:%S.%f" + + +def check_date(date: datetime) -> bool: + return date.month == 12 + + +def find_pop_cats(data: list[dict]) -> str: + if not data: + return r"{}" + + cats_counter = Counter() + cats_dct = {} + for order in data: + order_date = datetime.strptime(order["ordered_at"], DATE_FORMAT) + + if not check_date(order_date): + continue + + for item in order["items"]: + cat_id = item["category"]["id"] + cats_counter[cat_id] += 1 + cat_name = item["category"]["name"] + cats_dct[cat_id] = cat_name + + max_cnt = max(cats_counter.values()) + pop_cats = [ + cats_dct[cat_id] for cat_id in cats_counter if cats_counter[cat_id] == max_cnt + ] + + result = {"categories": sorted(pop_cats)} + return json.dumps(result, ensure_ascii=False) + + +def find_pop_cats_in_file(filename: str) -> str: + try: + with open(filename, "r", encoding="utf-8") as f: + data = json.load(f) + except FileNotFoundError: + print( + "Файл не найден. Вероятно, программа и файл лежат в разных папках. Переместите их в одну папку и запустите программу снова." + ) + exit() + + return find_pop_cats(data) + + +# Test the function +filename = "input.json" +result = find_pop_cats_in_file(filename) +print(result)