从展平字典创建嵌套字典 [英] Creating a nested dictionary from a flattened dictionary
问题描述
我有一个拼合的字典,我想把它做成嵌套的形式,
I have a flattened dictionary which I want to make into a nested one, of the form
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}}}
平面字典的结构应避免歧义出现任何问题.我希望它适用于任意深度的字典,但是性能并不是真正的问题.我见过许多用于平整嵌套字典的方法,但是基本上没有用于嵌套平整字典的方法.存储在字典中的值是标量或字符串,永远不可迭代.
The structure of the flat dictionary is such that there should not be any problems with ambiguities. I want it to work for dictionaries of arbitrary depth, but performance is not really an issue. I've seen lots of methods for flattening a nested dictionary, but basically none for nesting a flattened dictionary. The values stored in the dictionary are either scalars or strings, never iterables.
到目前为止,我已经有了一些可以接受输入的东西
So far I have got something which can take the input
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)
但是我在解决如何使其递归地创建字典的所有级别方面遇到了麻烦.
But I'm having trouble working out how to make this into something which recursively creates all levels of the dictionary.
任何帮助将不胜感激!
(关于为什么要执行此操作:我有一个结构等同于嵌套字典的文件,我想将此文件的内容存储在NetCDF文件的属性字典中,以后再检索.但是仅适用于NetCDF允许您将平面字典作为属性,因此我想展开以前存储在NetCDF文件中的字典.)
(As for why I want to do this: I have a file whose structure is equivalent to a nested dict, and I want to store this file's contents in the attributes dictionary of a NetCDF file and retrieve it later. However NetCDF only allows you to put flat dictionaries as the attributes, so I want to unflatten the dictionary I previously stored in the NetCDF file.)
推荐答案
这是我的看法:
def nest_dict(flat):
result = {}
for k, v in flat.items():
_nest_dict_rec(k, v, result)
return result
def _nest_dict_rec(k, v, out):
k, *rest = k.split('_', 1)
if rest:
_nest_dict_rec(rest[0], v, out.setdefault(k, {}))
else:
out[k] = v
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}}}
print(nest_dict(flat) == nested)
# True
这篇关于从展平字典创建嵌套字典的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!