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

如何用Python循环遍历树形JSON字典实现交互式问答

交互式遍历树形诊断系统解决方案

需求说明

已将诊断规则重构为树形字典,需实现控制台问答式遍历逻辑:从指定ID(如Bosniak)的system节点开始,根据用户输入逐步深入层级,直到输出无下层节点的终端诊断结果(如Bosniak II)。现有代码无法动态切换路径,需调整逻辑实现完整交互流程。

原始数据与问题代码

诊断树形JSON结构

[{"id": "Bosniak","system": {"0": "Wurde ein Nieren Protokoll gemacht, ist <25% der Lesion KM aufnehmend, und ist kein Fettgewebe zu sehen\n(1) alles trifft zu?\n(2) trifft nicht zu","1": {"0": "KM-aufnehmende Lesion >3cm, heterogene Lesion, viel Verkalkung?\n(1) mind. eins davon trifft zu\n(2) trifft nicht zu","1":"Bosniak1", "2":"Bosniak II"},"2": {"0": "Was ist zu sehen?\n(1) >25% KM-aufnehmend oder fettig\n(2) homogene Lesion 20 - 30 HU", "1": "Bosniak IV", "2":"Bosnaik V"}}}] 

现有问题代码

i = "1" #that is the index for the item with id "Bosniak" in my dict
while True:
    qloop = input("Select an option: ", )
    #probably here I need a recursive function 
    #or whatever where I can dynamically change my path,
    # so that I can call items in my json dict until the 
    #end of a nested layer is reached
    if #here I have some other code, not important
    else:
        print(data[i]["system"][qloop]["0"]) 
        #if I type "1" it prints "KM-aufnehmende Lesion >3cm, heterogene Lesion, viel Verkalkung?\n(1) mind. eins davon trifft zu\n(2) trifft nicht zu"
    break

解决方案

核心思路

维护当前遍历的节点引用,每次根据用户输入切换到对应子节点;若当前节点为字符串(终端节点),则输出结果并结束流程。以下提供两种实现方式:

方式一:递归实现

递归函数自动处理层级深入,逻辑更直观:

import json

# 解析JSON并定位Bosniak的诊断树
json_data = '''[{"id": "Bosniak","system": {"0": "Wurde ein Nieren Protokoll gemacht, ist <25% der Lesion KM aufnehmend, und ist kein Fettgewebe zu sehen\n(1) alles trifft zu?\n(2) trifft nicht zu","1": {"0": "KM-aufnehmende Lesion >3cm, heterogene Lesion, viel Verkalkung?\n(1) mind. eins davon trifft zu\n(2) trifft nicht zu","1":"Bosniak1", "2":"Bosniak II"},"2": {"0": "Was ist zu sehen?\n(1) >25% KM-aufnehmend oder fettig\n(2) homogene Lesion 20 - 30 HU", "1": "Bosniak IV", "2":"Bosnaik V"}}}]'''
data = json.loads(json_data)
bosniak_tree = next(item["system"] for item in data if item["id"] == "Bosniak")

def traverse_diagnosis(node):
    # 终端节点:输出结果
    if isinstance(node, str):
        print(f"最终诊断: {node}")
        return
    # 输出当前问题
    print(node["0"])
    # 获取有效输入(限制为1或2)
    while True:
        choice = input("Select an option: ")
        if choice in ["1", "2"]:
            break
        print("无效选项,请输入1或2")
    # 递归进入下一层
    traverse_diagnosis(node[choice])

# 启动遍历
traverse_diagnosis(bosniak_tree)

方式二:迭代实现(循环)

通过循环维护当前节点,避免递归深度限制(本场景层级较浅,两种方式均可):

import json

# 解析JSON并定位Bosniak的诊断树
json_data = '''[{"id": "Bosniak","system": {"0": "Wurde ein Nieren Protokoll gemacht, ist <25% der Lesion KM aufnehmend, und ist kein Fettgewebe zu sehen\n(1) alles trifft zu?\n(2) trifft nicht zu","1": {"0": "KM-aufnehmende Lesion >3cm, heterogene Lesion, viel Verkalkung?\n(1) mind. eins davon trifft zu\n(2) trifft nicht zu","1":"Bosniak1", "2":"Bosniak II"},"2": {"0": "Was ist zu sehen?\n(1) >25% KM-aufnehmend oder fettig\n(2) homogene Lesion 20 - 30 HU", "1": "Bosniak IV", "2":"Bosnaik V"}}}]'''
data = json.loads(json_data)
current_node = next(item["system"] for item in data if item["id"] == "Bosniak")

while True:
    # 到达终端节点,输出结果并退出
    if isinstance(current_node, str):
        print(f"最终诊断: {current_node}")
        break
    # 输出当前问题
    print(current_node["0"])
    # 获取有效输入
    while True:
        choice = input("Select an option: ")
        if choice in ["1", "2"]:
            break
        print("无效选项,请输入1或2")
    # 切换到下一层节点
    current_node = current_node[choice]

效果说明

运行代码后,控制台会循环提示输入选项,根据用户选择逐步深入诊断树,直到输出最终的终端诊断结果(如Bosniak II),完成完整交互流程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 08:32:52