У меня есть плоский словарь, который я хочу превратить во вложенный, в форме
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.)