N. Слияние данных

Одна местная компания производит обновление данных о пользователях и заодно решили реорганизовать систему хранения.

Напишите программу, которая обновляет данные о пользователях, записанных в JSON файле.

Формат ввода

Пользователь вводит два имени файла.
В первом хранится JSON массив пользователей.
Во втором — массив новых данных.

Информация о каждом пользователе представляется JSON объектом, в котором обязательно присутствует поле name, описывающее имя пользователя. Остальные поля являются дополнительными.

Формат вывода

В первый файл запишите информацию о пользователях в виде JSON объекта, ключами которого выступают имена пользователей, а значениями — объекты с информацией о них.

Если какая-либо дополнительная информация о пользователе изменяется, то требуется сохранить лексикографически большее значение.

Пример

Ввод

# Пользовательский ввод:
users.json
updates.json

# Содержимое файла users.json
[
    {
        "name": "Ann",
        "address": "Flower st."
    },
    {
        "name": "Bob",
        "address": "Summer st.",
        "phone": "+7 (123) 456-78-90"
    }
]

# Содержимое файла updates.json
[
    {
        "name": "Ann",
        "address": "Awesome st.",
        "phone": "+7 (098) 765-43-21"
    },
    {
        "name": "Bob",
        "address": "Winter st."
    }
]

Вывод

# Содержимое файла users.json
{
    "Ann": {
        "address": "Flower st.",
        "phone": "+7 (098) 765-43-21"
    },
    "Bob": {
        "address": "Winter st.",
        "phone": "+7 (123) 456-78-90"
    }
}

Решение

Эта задача вызывает больше всего вопросов учеников. В основном они связаны с тем, что не хватает стройности мышления при подходе к решению задачи. Попытка работать со списком словарей в каждом из которых одно из полей – главное сбивает с толку и запутывает. Но если при считывании файла и разборе каждого словаря из списка сразу переделывать его в соотвествующий словарь, то все становится на свои места.

В решениях представлено два варианта – “академическое”, когда исходный файл сразу считывается в правильный словарь, и операции обновления уже идут с правильным словарем. И более короткий с точки зрения кода, но менее эффективный с точки зрения производительности код, который формирует правильный словарь только после того, как определились какое из значений нужно записать в целевой словарь.

Посмотреть код

Решение

Python
import json

json_name = input()
json_update = input()

with open(json_name) as file:
    source = json.load(file)
with open(json_update) as file:
    updates = json.load(file)

name_key = 'name'
new_dict = {}

for data in source:
    name = data.pop(name_key)
    new_dict[name] = data

for data in updates:
    name = data.pop(name_key)
    if name not in new_dict:  # на случай,если исходный словарь не содержал такого имени
        new_dict[name] = {}
    for key in data.keys():
        if new_dict[name].get(key, '') < data[key]:
            new_dict[name][key] = data[key]

with open(json_name, 'w') as file:
    json.dump(new_dict, file, sort_keys=False, indent=4, ensure_ascii=False)

Решение

Python
import json

json_name = input()
json_update = input()

with open(json_name) as file:
    source = json.load(file)
with open(json_update) as file:
    updates = json.load(file)

name_key = 'name'
new_dict = {}

for update in updates:
    for data in source:
        if update[name_key] == data[name_key]:
            for key in update.keys():
                if update[key] > data.get(key, ''):
                    data[key] = update[key]

for data in source:
    name = data.pop(name_key)
    new_dict[name] = data

with open(json_name, 'w') as file:
    json.dump(new_dict, file, sort_keys=False, indent=4, ensure_ascii=False)
Подписаться
Уведомить о
guest
4 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии