【发布时间】:2018-11-09 10:52:41
【问题描述】:
我有一个扁平化的字典,我想把它做成一个嵌套的字典,格式为
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 文件中的字典展开。)
【问题讨论】:
-
写得很好的问题。
标签: python dictionary recursion nested netcdf