python教程—从扁平字典创建嵌套字典-Python实用宝典

python教程—从扁平字典创建嵌套字典

我有一个扁平的字典,我想把它变成一个嵌套的,我想把它转换成形式

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

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

回答

以下是我的看法:

    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实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

本文由 Python实用宝典 作者:Python实用宝典 发表,其版权均为 Python实用宝典 所有,文章内容系作者个人观点,不代表 Python实用宝典 对观点赞同或支持。如需转载,请注明文章来源。
1

发表评论