Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Решение задания #5

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,19 @@
4. Найденная в соответствии с условием задачи категория должна выводиться в изначальном наименовании, приведенном в файле с входными данными. Если таких категорий несколько, то на вывод они все подаются в алфавитном порядке.

## Автор решения
**ФИО:** Чемлёва Анастасия Сергеевна
**telegram:** @n3rdy_nestea
**vk:** @mightybread

## Описание реализации
Для реализации требований задачи был использован язык программирования Python, а также его модули os и json. Код решения находится в файле solution.py. Он содержит в себе следующие функции:

- `check_json_file()` - проверяет JSON-файл на соответствие необходимому формату и возвращает данные из файла
- `generate_report()` - генерирует отчет о популярных категориях товаров на основе предоставленных данных в предновогодний период

Сначала происходит определение текущего рабочего каталога и пути к файлу input.json. В случае успеха путь к JSON-файлу передаётся функции `check_json_file()`, в которой осуществляется открытие файла и извлечение данных с последующей проверкой вложенными циклами `for` на соответствие структуре. Проверенные данные переходят функции `generate_report()`. Список `pre_new_year_items` заполняется товарами, заказанными в предновогодний период. На его основе формируется словарь `categories_count`, где ключу соответствует наименование категории, а значению - количество заказанных в этой категории товаров. Функция `max()` находит максимальное число товаров среди всех категорий и заносит в переменную `max_count`, по которой происходит добавление наиболее популярных категорий в список `popular_categories`. При отсутствии заказов в предновогодний период этот список остаётся пустым. Заключительным шагом является формирование отчета в формате JSON и возврат из функции.

## Инструкция по сборке и запуску решения
Для сборки и запуска решения необходимо прописать следующую команду:
```python solution.py```
При этом файл input.json должен располагаться в рабочем каталоге.
81 changes: 81 additions & 0 deletions solution.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
import json
import os
from typing import List, Dict


def generate_report(valid_data: List[Dict]) -> str:
"""
Генерирует отчет о популярных категориях товаров на основе предоставленных данных в предновогодний период.

Args:
valid_data (List[Dict]): Список словарей с данными о заказах и товарами.

Returns:
str: JSON-строка с отчетом о популярных категориях товаров в предновогодний период.
"""
# Формируем список товаров, заказанных в предновогодний период
pre_new_year_items = []
for order in valid_data:
if order.get("ordered_at", "")[5:7] == "12":
pre_new_year_items.extend(order["items"])

# Подсчитываем количество товаров в каждой категории
categories_count = {}
for item in pre_new_year_items:
category_name = item["category"]["name"]
categories_count[category_name] = categories_count.get(category_name, 0) + 1

# Определяем популярные категории
if categories_count:
max_count = max(categories_count.values())
popular_categories = sorted([category for category, count in categories_count.items() if count == max_count])
else:
popular_categories = []

# Генерируем отчет в формате JSON
report_data = {"categories": popular_categories}
report_json = json.dumps(report_data, ensure_ascii=False)

return report_json


def check_json_file(file_path: str) -> List[Dict]:
"""
Проверяет JSON-файл на соответствие необходимому формату и возвращает данные из файла.

Args:
file_path (str): Путь к JSON-файлу.

Returns:
List[Dict]: Список словарей с данными о заказах и товарами в случае соответствия формату, иначе возвращает False.
"""
# Проверяем формат JSON-файла и возвращаем данные
with open(file_path, 'r', encoding='utf-8') as file:
received_data = json.load(file)

# Проверяем соответствие структуры данных требуемому формату
for order in received_data:
if "ordered_at" not in order or "items" not in order:
return False
for item in order["items"]:
if "id" not in item or "name" not in item or "category" not in item:
return False
if "id" not in item["category"] or "name" not in item["category"]:
return False

return received_data


# Определяем текущий рабочий каталог
current_directory = os.getcwd()
input_json_file = os.path.join(current_directory, "input.json")

# Проверяем наличие и соответствие JSON-файла
if os.path.exists(input_json_file):
if data := check_json_file(input_json_file):
report = generate_report(data)
print(report)
else:
print("Файл input.json не соответствует необходимому шаблону.")
else:
print("Файл input.json не найден в текущем рабочем каталоге.")