我有一个扁平的字典,我想把它变成嵌套的形式
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)
但我不知道如何将其递归地转换为可以创建所有字典级别的内容。
任何帮助都将不胜感激!
(至于为什么我想这样做:我有一个文件,其结构等同于嵌套的字典,并且我想将此文件的内容存储在NetCDF文件的属性字典中并稍后检索它。然而,NetCDF仅允许您将平面字典作为属性放置,因此我想展开以前存储在NetCDF文件中的字典。)