问题描述
问题:
如下例所示打印字典的函数
recursive_dict = {
'a': 1,'b': {
'c': 1,'d': 4
},'e':
{
'f': 3,'g':
{
'h': 5,'i': 6
}
},'j': 10
}
to
'a' - 1
'b' - 'c' - 1
'b' - 'd' - 4
'e' - 'f' - 3
'e' - 'g' - 'h' - 5
'e' - 'g' - 'i' - 6
'j' - 10
我的代码:
由于我是python初学者,所以欢迎对代码提出任何批评,或者采取任何使它更易于阅读的方式。较高级别的递归值后,代码将不起作用,因为它保留了旧密钥。我认为我必须检测字典何时结束,以便从old_key中删除我串联的最后一个键。 再难一点?想法是将字典转换为树,然后继续读取树的所有分支。
def print_dictionary_tree(tree_dict,default_separator='-',branch="",old_key=""):
for key,value in tree_dict.items():
if type(value) != dict:
if old_key == "":
branch += f"%{key}% {default_separator} {value} \n"
else:
branch += f"{old_key} {default_separator} /{key}/ {default_separator} {value} \n"
else:
if old_key != "":
old_key += f" {default_separator} %{key}%"
elif key != value.get(key):
old_key += f"^{key}^"
branch += print_dictionary_tree(value,default_separator,"",old_key)
return branch
返回
'a' - 1
'b' - 'c' - 1
'b' - 'd' - 4
'b' - 'e' - 'f' - 3
'b' - 'e' - 'g' - 'h' - 5
'b' - 'e' - 'g' - 'i' - 6
'b' - 'e' - 'j' - 10
有用的链接我发现类似,但无法修复我的功能:
List of branches of a Python tree
Loop through all nested dictionary values?
解决方法
Python生成器可以快速解决此类问题-
def traverse(d,path = []):
if isinstance(d,dict):
for (k,v) in d.items():
yield from traverse(v,[*path,k])
else:
yield [*path,d]
input = ... # <- your dict
for p in traverse(input):
print("-".join(map(str,p)))
输出-
a-1
b-c-1
b-d-4
e-f-3
e-g-h-5
e-g-i-6
j-10
,
每次退出内部词典时,您只需要清除old_keys
:
def print_dictionary_tree(tree_dict,default_separator='-',branch="",old_key=""):
for key,value in tree_dict.items():
if type(value) != dict:
if old_key == "":
branch += f"{key} {default_separator} {value} \n"
else:
branch += f"{old_key} {default_separator} {key} {default_separator} {value} \n"
else:
if old_key != "":
old_key += f" {default_separator} {key}"
elif key != value.get(key):
old_key += f"{key}"
branch += print_dictionary_tree(value,default_separator,"",old_key)
old_key = old_key.replace(key,"") ## < --- HERE
return branch
结果:
a - 1
b - c - 1
b - d - 4
e - f - 3
e - g - h - 5
e - g - i - 6
j - 10