Python-JSON到嵌套和扁平化字典
我是Python新手,目前正在尝试阅读以下JSON:Python-JSON到嵌套和扁平化字典,python,dictionary,recursion,nested,flatten,Python,Dictionary,Recursion,Nested,Flatten,我是Python新手,目前正在尝试阅读以下JSON: "level1_key1":"1", "level1_key2":{ "level2_key1":"2", "level2_key2":{ "level3_key1":"Max depth" } } 然后将其放入字典(现在已经完成),最后显示为嵌套和扁平(我使用的是Python 3.6)。我想用递归来实现它,并避免使用第三方库。我尝试了StackOverflow的所有建议,但无法使结果看起来像任务中的
"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'}
我非常感谢任何帮助。提前谢谢 请尝试下面的代码。它应该能解决你的疑问
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':'Max depth','level1_key1':'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'}
你好,谢谢你的回答。不幸的是,当我尝试执行时,我得到了以下错误:回溯(最后一次调用):文件“File.py”,第73行,打印中(process_dict(example_dict))文件“File.py”,第64行,process_dict for key,val in dict_val.iteritems():AttributeError:'dict'对象没有属性'iteritems',这可能是Python版本的某些东西吗?我刚刚看到iteritems()现在是Python 3上的items()。对其进行了编辑,但未获得所需的结果。谢谢你的回答,我会继续努力的。你得到了什么结果?你好。这是代码和结果的要点-删除打印键、值和try的print语句。我也更新了上面的内容。谢谢你的回答。不幸的是,通过这段代码,我得到了以下信息:{'level1_-key1':'1','level2_-key1':'2','level3_-key1':'恭喜你达到了最高的权限'}可能是我这方面的问题,我做错了。。。