gpt4 book ai didi

python - 从扁平字典创建嵌套字典

转载 作者:IT老高 更新时间:2023-10-28 20:30:55 27 4
gpt4 key购买 nike

我有一个扁平化的字典,我想把它做成一个嵌套的字典,格式为

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 文件中的字典展开。)

最佳答案

这是我的看法:

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

关于python - 从扁平字典创建嵌套字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50607128/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com