Одна местная компания производит обновление данных о пользователях и заодно решили реорганизовать систему хранения.
Напишите программу, которая обновляет данные о пользователях, записанных в 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"
}
}
Решение
Эта задача вызывает больше всего вопросов учеников. В основном они связаны с тем, что не хватает стройности мышления при подходе к решению задачи. Попытка работать со списком словарей в каждом из которых одно из полей – главное сбивает с толку и запутывает. Но если при считывании файла и разборе каждого словаря из списка сразу переделывать его в соотвествующий словарь, то все становится на свои места.
В решениях представлено два варианта – “академическое”, когда исходный файл сразу считывается в правильный словарь, и операции обновления уже идут с правильным словарем. И более короткий с точки зрения кода, но менее эффективный с точки зрения производительности код, который формирует правильный словарь только после того, как определились какое из значений нужно записать в целевой словарь.
Посмотреть код
Решение
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)
Решение
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)