Sur*_*ren 6 python dictionary nested
如果下面是我的嵌套字典,我想通过递归方式解析并打印所有值以及嵌套键的完整路径.
my_dict = {'attr':{'types':{'tag':{'name':'Tom', 'gender':'male'},'category':'employee'}}}
Run Code Online (Sandbox Code Playgroud)
预期产量:
Key structure : my_dict["attr"]["types"]["tag"]["name"]<br>
value : "Tom"<br>
Key structure : my_dict["attr"]["types"]["tag"]["gender"]<br>
value : "male"<br>
Key structure : my_dict["attr"]["types"]["category"]<br>
value : "employee"<br>
Run Code Online (Sandbox Code Playgroud)
我写了一个递归函数,但运行到这个:
my_dict = {'attr':{'types':{'tag':{'name':'Tom','gender':'male'},'category':'employee'}}}
def dict_path(path,my_dict):
for k,v in my_dict.iteritems():
if isinstance(v,dict):
path=path+"_"+k
dict_path(path,v)
else:
path=path+"_"+k
print path,"=>",v
return
dict_path("",my_dict)
Run Code Online (Sandbox Code Playgroud)
输出:
_attr_types_category => employee
_attr_types_category_tag_gender => male
_attr_types_category_tag_gender_name => Tom
在上面:对于男性,关键结构不应该包含"类别"如何保留正确的关键结构?
cat*_*ran 10
您不应该更改函数中的path变量dict_path():
def dict_path(path,my_dict):
for k,v in my_dict.iteritems():
if isinstance(v,dict):
dict_path(path+"_"+k,v)
else:
print path+"_"+k,"=>",v
dict_path("",my_dict)
Run Code Online (Sandbox Code Playgroud)
正如 catavaran 所提到的,您的问题是由将新路径组件添加到循环path内的变量引起的for。您需要将新路径放入调用中,以便将其传递到下一级递归,并且不会干扰for当前递归级别循环中后续项目的路径。
这是使用递归生成器的替代解决方案,而不是在dict_path函数内打印结果。(FWIW,我曾经print json.dumps(my_dict, indent=4)重新格式化字典)。
my_dict = {
"attr": {
"types": {
"category": "employee",
"tag": {
"gender": "male",
"name": "Tom"
}
}
}
}
def dict_path(my_dict, path=None):
if path is None:
path = []
for k,v in my_dict.iteritems():
newpath = path + [k]
if isinstance(v, dict):
for u in dict_path(v, newpath):
yield u
else:
yield newpath, v
for path, v in dict_path(my_dict):
print '_'.join(path), "=>", v
Run Code Online (Sandbox Code Playgroud)
输出
attr_types_category => employee
attr_types_tag_gender => male
attr_types_tag_name => Tom
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3229 次 |
| 最近记录: |