如何用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
相关产品推荐
相关产品推荐

