【问题标题】:Python - JSON to nested and flatten dictionaryPython - JSON 到嵌套和展平字典
【发布时间】:2018-10-30 05:43:31
【问题描述】:

我是 Python 新手,目前正在尝试读取以下 JSON:

"level1_key1":"1",
"level1_key2":{
    "level2_key1":"2",
    "level2_key2":{
        "level3_key1":"Max depth"
    }
}

然后将其放入字典中(现在已完成),最后将其显示为嵌套和展平(我使用的是 Python 3.6)。我想用递归来做,避免使用第三方库。我尝试了 StackOverflow 的所有建议,但无法使结果看起来像任务中的结果:

Nested dict: {u'level1_key2': {u'level2_key2': {u'level3_key1': u'Max depth'}, u'level2_key1': u'2'}, u'level1_key1': u'1'}
Flatten dict: {u'level2_key1': u'2', u'level3_key1': u'Max depth', u'level1_key1': u'1'}

非常感谢任何帮助。提前致谢!

【问题讨论】:

    标签: python dictionary recursion nested flatten


    【解决方案1】:

    你可以在递归中使用dict.items:

    d =  {u'level1_key2': {u'level2_key2': {u'level3_key1': u'Max depth'}, u'level2_key1': u'2'}, u'level1_key1': u'1'}
    def flatten(d):
       _r = [[(a, b)] if not isinstance(b, dict) else flatten(b) for a, b in d.items()]
       return [i for b in _r for i in b]
    
    new_d = dict(flatten(d))
    

    输出:

    {'level3_key1': 'Max depth', 'level2_key1': '2', 'level1_key1': '1'}
    

    【讨论】:

    • 感谢您的回答。不幸的是,使用此代码,我得到以下信息: {'level1_key1': '1', 'level2_key1': '2', 'level3_key1': 'Congrats you have reached the maximum dept of the dict'} 可能是我的结果我做错了......
    【解决方案2】:

    请尝试以下代码。它应该可以解决您的问题。

    example_dict = {"level1_key1":"1",
                        "level1_key2":{
                            "level2_key1":"2",
                            "level2_key2":{
                                "level3_key1":"Max depth"
                            }
                         }
                     }   
    
    flatten_dict = {}
    def process_dict(dict_val):
        for key, val in dict_val.items():
            if isinstance(val, dict) and val:
                process_dict(val)
            else:
                flatten_dict.update({key:val})
        return flatten_dict
    
    print process_dict(example_dict)
    


    答案:

    {'level2_key1': '2', 'level3_key1': '最大深度', 'level1_key1': '1'}

    【讨论】:

    • 您好,感谢您的回答。不幸的是,当我尝试执行时,我收到以下错误: Traceback (most recent call last): File "file.py", line 73, in print(process_dict(example_dict)) File "file.py", line 64, in process_dict for key, val in dict_val.iteritems(): AttributeError: 'dict' object has no attribute 'iteritems' 会不会是Python版本的问题?
    • 我刚刚看到 iteritems() 现在是 Python 3 上的 items()。编辑它但没有得到想要的结果。还是谢谢你的回答,我会继续努力的。
    • 你得到了什么结果?
    • 你好。这是代码和结果的要点 - gist.github.com/aktan4uk/b6f6f93d18d29d585099f1087bda065e
    • 删除打印键、值和尝试的打印语句。我也更新了上面的内容。
    猜你喜欢
    • 2020-12-15
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    • 2019-11-15
    • 2012-09-06
    • 2021-08-31
    • 2021-06-02
    • 2020-12-24
    相关资源
    最近更新 更多