Top.Mail.Ru
Ответы

Помогите пожалуйста с решением задачи на Python

Найдите различия между двумя JSON-файлами. Если различающиеся параметры входят в diff_list, выведите различие. Иными словами, вам нужно отловить изменение определённых параметров и вывести значение: что изменилось и на что. Набор ключей в обоих файлах идентичный, различаются лишь значения.

Напишите программу, которая:

загружает данные из двух предложенных JSON-файлов;
выполняет сравнение параметров, указанных в diff_list;
формирует результат в виде словаря;
записывает словарь в JSON-файл с названием result.json.
Помимо вывода в консоль, должен быть сформирован JSON-файл с получившимся словарём (result.json).

Данные, загруженные из json_old.json:

1
 {'company_id': 111111, 'resource': 'record', 'resource_id': 406155061, 'status': 'create', 'data': {'id': 11111111, 'company_id': 111111, 'services': [{'id': 9035445, 'title': 'Стрижка', 'cost': 1500, 'cost_per_unit': 1500, 'first_cost': 1500, 'amount': 1}], 'goods_transactions': [], 'staff': {'id': 1819441, 'name': 'Мастер'}, 'client': {'id': 130345867, 'name': 'Клиент', 'phone': '79111111111', 'success_visits_count': 2, 'fail_visits_count': 0}, 'clients_count': 1, 'datetime': '2022-01-25T11:00:00+03:00', 'create_date': '2022-01-22T00:54:00+03:00', 'online': False, 'attendance': 0, 'confirmed': 1, 'seance_length': 3600, 'length': 3600, 'master_request': 1, 'visit_id': 346427049, 'created_user_id': 10573443, 'deleted': False, 'paid_full': 0, 'last_change_date': '2022-01-22T00:54:00+03:00', 'record_labels': '', 'date': '2022-01-22 10:00:00'}} 

Данные, загруженные из json_new.json:

1
 {'company_id': 111111, 'resource': 'record', 'resource_id': 406155061, 'status': 'create', 'data': {'id': 11111111, 'company_id': 111111, 'services': [{'id': 22222225, 'title': 'Стрижка', 'cost': 1500, 'cost_per_unit': 1500, 'first_cost': 1500, 'amount': 1}], 'goods_transactions': [], 'staff': {'id': 1819441, 'name': 'Мастер'}, 'client': {'id': 130345867, 'name': 'Клиент', 'phone': '79111111111', 'success_visits_count': 2, 'fail_visits_count': 0}, 'clients_count': 1, 'datetime': '2022-01-25T13:00:00+03:00', 'create_date': '2022-01-22T00:54:00+03:00', 'online': False, 'attendance': 2, 'confirmed': 1, 'seance_length': 3600, 'length': 3600, 'master_request': 1, 'visit_id': 346427049, 'created_user_id': 10573443, 'deleted': False, 'paid_full': 1, 'last_change_date': '2022-01-22T00:54:00+03:00', 'record_labels': '', 'date': '2022-01-22 10:00:00'}} 

Результат

print(result)
В консоли должно вывестись следующее сообщение:

{'services': [{'id': 22222225, 'title': 'Стрижка', 'cost': 1500, 'cost_per_unit': 1500, 'first_cost': 1500, 'amount': 1}], 'datetime': '2022-01-25T13:00:00+03:00'}

Только авторизированные пользователи могут оставлять свои ответы
Дата
Популярность
Аватар пользователя
Оракул
1234567891011121314151617181920212223242526
 import json 
 
# Загрузка данных из JSON-файлов 
with open('json_old.json', 'r') as f: 
    old_data = json.load(f) 
with open('json_new.json', 'r') as f: 
    new_data = json.load(f) 
 
# Определение списка ключей для сравнения 
diff_list = ['services', 'datetime'] 
 
# Инициализация словаря результата 
result = {} 
 
# Сравнение значений ключей в diff_list 
for key in diff_list: 
    if old_data['data'][key] != new_data['data'][key]: 
        result[key] = new_data['data'][key] 
 
# Вывод результата 
print(result) 
 
# Запись результата в JSON-файл 
with open('result.json', 'w') as f: 
    json.dump(result, f, ensure_ascii=False, indent=4) 
 

Эта программа загружает данные из двух JSON-файлов, json_old.json и json_new.json, и сравнивает значения ключей, указанных в diff_list. Если значения отличаются, новое значение добавляется в словарь result. Результат затем выводится на консоль и записывается в JSON-файл с именем result.json.

Аватар пользователя
Профи
123456789101112131415161718192021222324252627282930313233343536373839404142434445
import json
from typing import Any, Dict, Union

def get_nested_value(data: Dict[str, Any], path: str) -> Any:
    """Получает значение из словаря по вложенному пути (например, 'services.0.cost')."""
    keys = path.split('.')
    for key in keys:
        if isinstance(data, list) and key.isdigit():
            data = data[int(key)]
        elif isinstance(data, dict):
            data = data.get(key, None)
        else:
            return None
        if data is None:
            return None
    return data

def compare_data(old_data: Dict[str, Any], new_data: Dict[str, Any], diff_list: list) -> Dict[str, Any]:
    result = {}
    for key in diff_list:
        old_val = get_nested_value(old_data, f"data.{key}")
        new_val = get_nested_value(new_data, f"data.{key}")

        if old_val != new_val:
            result[key] = new_val

    return result

# Загрузка данных
with open('json_old.json', 'r', encoding='utf-8') as f:
    old_data = json.load(f)
with open('json_new.json', 'r', encoding='utf-8') as f:
    new_data = json.load(f)

# Сравниваем как вложенные ключи (например, 'services.0.cost')
# diff_list = ["services.0.cost", "datetime"]
diff_list = ["services", "staff", "datetime"]
result = compare_data(old_data, new_data, diff_list)

# Вывод результата
print(json.dumps(result, ensure_ascii=False))

# Запись результата
with open('result.json', 'w', encoding='utf-8') as f:
    json.dump(result, f, ensure_ascii=False, indent=4)