以树状结构打印字典

1 投票
4 回答
86 浏览
提问于 2025-04-14 18:11

我有一个嵌套的字典,里面有父子关系。

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

看起来这正是你想要的结果。

撰写回答