如何修改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
修改关键点说明
- 拆分渲染逻辑:将主函数与节点渲染函数
_render_node分离,避免深层嵌套时的逻辑混乱 - 新增列表处理:把列表项单独展开为树形节点,不再直接输出字符串
- 优化缩进规则:根据父节点是否为最后一个元素,动态生成缩进符号(
┊或空格),确保深层层级显示正确 - 区分值类型显示:
- 值为字典/列表时,键后不加分号,换行展开子节点
- 值为普通类型时,显示
键: 值格式 - 列表项直接显示内容,无需键
测试用例与输出
测试数据:
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
相关产品推荐
相关产品推荐

