У меня есть сплющенный словарь, который я хочу сделать вложенным, формы
flat = {'X_a_one': 10,
'X_a_two': 20,
'X_b_one': 10,
'X_b_two': 20,
'Y_a_one': 10,
'Y_a_two': 20,
'Y_b_one': 10,
'Y_b_two': 20}
Я хочу преобразовать его в форму
nested = {'X': {'a': {'one': 10,
'two': 20},
'b': {'one': 10,
'two': 20}},
'Y': {'a': {'one': 10,
'two': 20},
'b': {'one': 10,
'two': 20}}}
Структура плоского словаря такова, что не должно быть никаких проблем с двусмысленностями. Я хочу, чтобы он работал на словари произвольной глубины, но производительность на самом деле не проблема. Я видел множество методов для выравнивания вложенного словаря, но в основном ни один из них не вставлял сплющенный словарь. Значения, хранящиеся в словаре, являются скалярами или строками, никогда не повторяющимися.
До сих пор у меня есть что-то, что может принять вход
test_dict = {'X_a_one': '10',
'X_b_one': '10',
'X_c_one': '10'}
к выходу
test_out = {'X': {'a_one': '10',
'b_one': '10',
'c_one': '10'}}
используя код
def nest_once(inp_dict):
out = {}
if isinstance(inp_dict, dict):
for key, val in inp_dict.items():
if '_' in key:
head, tail = key.split('_', 1)
if head not in out.keys():
out[head] = {tail: val}
else:
out[head].update({tail: val})
else:
out[key] = val
return out
test_out = nest_once(test_dict)
Но у меня возникли проблемы с разработкой того, как сделать это во что-то, что рекурсивно создает все уровни словаря.
Любая помощь будет оценена!
(Что касается того, почему я хочу это сделать: у меня есть файл, структура которого эквивалентна вложенному dict, и я хочу сохранить это содержимое файла в словаре атрибутов файла NetCDF и получить его позже. Однако NetCDF позволяет вам поместите плоские словари в качестве атрибутов, поэтому я хочу развязать словарь, который я ранее хранил в файле NetCDF.)