You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改Python字典树形输出代码,实现列表展开与深层嵌套正确渲染?

实现Python字典的树形结构展示(符合预期格式)

原代码存在几个核心问题:

  • 列表类型直接转为字符串输出,无法展开为树形结构
  • 深层嵌套的缩进符号渲染错误,层级关系混乱
  • 字典节点的显示逻辑不完善,深层结构处理异常

以下是修改后的代码,完全匹配你期望的输出格式:

def custom_display(input_data, depth=0):
    # 顶层标题初始化
    if depth == 0:
        output = "Message\n"
        # 遍历顶层字典的所有键值对
        for idx, (key, value) in enumerate(input_data.items()):
            is_last = idx == len(input_data.items()) - 1
            output += _render_node(key, value, depth + 1, is_last, "")
        return output
    
    return ""

def _render_node(key, value, depth, is_last, prefix):
    output = ""
    # 根据父节点是否为最后一项,生成缩进前缀
    indent_prefix = prefix + ("  ┊ " if not is_last else "    ")
    
    if key is not None:
        # 生成当前节点的连接符
        connector = "  └ " if is_last else "  ├ "
        output += prefix + connector
        # 判断值类型,决定是否加分号
        if isinstance(value, (dict, list)):
            output += f"{key}\n"
        else:
            output += f"{key}: {value}\n"
    
    # 处理字典类型的值
    if isinstance(value, dict):
        for idx, (sub_key, sub_val) in enumerate(value.items()):
            sub_is_last = idx == len(value.items()) - 1
            output += _render_node(sub_key, sub_val, depth + 1, sub_is_last, indent_prefix)
    # 处理列表类型的值,展开每一项
    elif isinstance(value, list):
        for idx, item in enumerate(value):
            sub_is_last = idx == len(value) - 1
            output += _render_node(None, item, depth + 1, sub_is_last, indent_prefix)
    # 处理列表项或无键的普通值
    elif key is None:
        connector = "  └ " if is_last else "  ├ "
        output += prefix + connector + f"{value}\n"
    
    return output

修改关键点说明

  1. 拆分渲染逻辑:将主函数与节点渲染函数_render_node分离,避免深层嵌套时的逻辑混乱
  2. 新增列表处理:把列表项单独展开为树形节点,不再直接输出字符串
  3. 优化缩进规则:根据父节点是否为最后一个元素,动态生成缩进符号(┊或空格),确保深层层级显示正确
  4. 区分值类型显示:
    • 值为字典/列表时,键后不加分号,换行展开子节点
    • 值为普通类型时,显示键: 值格式
    • 列表项直接显示内容,无需键

测试用例与输出

测试数据:

test_dict = {
    "message_id": 445793,
    "from": {
        "id": 106596774,
        "is_bot": False,
        "first_name": "Komron",
        "last_name": "Aripov",
        "username": "tgcode",
        "language_code": {
            "code_specs": ["elt1", "elt2", "elt3"],
            "item": "value",
            "code": "utf"
        }
    },
    "chat": {
        "id": 106596774,
        "first_name": "Komron",
        "last_name": "Aripov",
        "username": "tgcode",
        "attributes": ["elt1", "elt2", "elt3", "elt4"],
        "type": "private"
    },
    "date": 1549380586,
    "list": ["elt1", "elt2", "elt3", "elt4"]
}

print(custom_display(test_dict))

输出结果:

Message
  ├ message_id: 445793
  ├ from
  ┊   ├ id: 106596774
  ┊   ├ is_bot: False
  ┊   ├ first_name: Komron
  ┊   ├ last_name: Aripov
  ┊   ├ username: tgcode
  ┊   └ language_code
  ┊       ├ code_specs
  ┊       ┊   ├ elt1
  ┊       ┊   ├ elt2
  ┊       ┊   └ elt3
  ┊       ├ item: value
  ┊       └ code: utf
  ├ chat
  ┊   ├ id: 106596774
  ┊   ├ first_name: Komron
  ┊   ├ last_name: Aripov
  ┊   ├ username: tgcode
  ┊   ├ attributes
  ┊   ┊   ├ elt1
  ┊   ┊   ├ elt2
  ┊   ┊   ├ elt3
  ┊   ┊   └ elt4
  ┊   └ type: private
  ├ date: 1549380586
  └ list
      ├ elt1
      ├ elt2
      ├ elt3
      └ elt4

内容的提问来源于stack exchange,提问作者KVN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 01:47:17