以树状结构打印字典
我有一个嵌套的字典,里面有父子关系。
dict_tree = {'A': {'b': {'c': {'d': {}, 'e': {'f': {}}}}}}
在这个字典中,A是根节点,而任何没有子节点的节点,它的值会是{}(d和f就是这样的节点)。
我想把这个字典打印成树状结构,像这样:
A
|-b
|-c
|-d
|-e
|-f
我尝试使用了下面这个库 https://anytree.readthedocs.io/en/latest/importer/dictimporter.html
dict_tree = {'A': {'b': {'c': {'d': {}, 'e': {'f': {}}}}}}
from anytree.importer import DictImporter
from anytree import RenderTree
importer = DictImporter()
root = importer.import_(dict_tree)
print(RenderTree(root))
但是输出结果是:
AnyNode(A={'b': {'c': {'d': {}, 'e': {'f': {}}}}})
看起来这个库接受的字典格式和我用的不同(文档也没有特别有帮助)。
有没有其他方法可以实现这个目标呢?
4 个回答
1
你需要使用json模块
import json
print(json.dumps(dict_tree, indent=2))
输出结果会是:
{
"A": {
"b": {
"c": {
"d": {},
"e": {
"f": {}
}
}
}
}
}
1
我查看了文档,似乎它期待以下这种格式:
{'a': 'A', 'children': [{'a': 'B', 'children': [{'a': 'C', 'children': [{ 'a' : 'D'}, {'b': 'E', 'children': { 'a' : 'F'}}]}]}]}
注意:我把你例子中的字符都转换成大写了,这样更容易区分anytree所需的输入格式和你的例子。
如果你想使用这个库,那么你需要按照要求的格式重新整理字典。
如果你想自己写代码,比如直接操作你提供的那个字典,那么可以试试这样:
def print_node(node, lvl):
if len(node.keys()) == 0:
return
prefix = ' ' * lvl
if lvl > 0:
prefix = prefix + '|-'
for item in node.items():
print(f'{prefix}{item[0]}')
print_node(item[1], lvl + 1)
3
你需要一个递归函数来“遍历”一个字典中的字典。
dict_tree = {"A": {"b": {"c": {"d": {}, "e": {"f": {}}}}}}
def print_tree_level(dct, level=0):
for key, value in dct.items():
print(
" " * (level - 1),
"|-" if level else "",
key,
sep="",
)
print_tree_level(value, level + 1)
print_tree_level(dict_tree)
这段代码会输出
A
|-b
|-c
|-d
|-e
|-f
看起来这正是你想要的结果。