json 通过用户输入python遍历字典的嵌套层

ozxc1zmp  于 2023-04-08  发布在  Python
关注(0)|答案(1)|浏览(173)

我以前也贴过类似的问题,但是,条件有点变化,所以我想重新措辞。
我有以下dict结构:

[{
        "id": "id01",
        "system": 
                    {
                    "0": "initial question \n Choice A \n Choice B",
                    "1": {"0": "Answer Choice A\n Second Choice C \n Second Choice D",
                          "1":"Final Answer Choice AC", 
                          "2":"Final Answer Choice AD"},
                    "2": {"0": "Answer Choice B\n Second Choice A \n Second Choice B", 
                          "1": "Final Answer Choice BA", 
                          "2":"Final Answer Choice BB"}
                    }         
    
}]

这是一个类似于dictonary的树,用户可以通过控制台输入来迭代。这是我的代码:

while True:
            qloop = input("Select an option: ", )

            if qloop == "R":
                break
            else:
                print(data[i]["system"][qloop]) #here I want to use the qloop input to stepwise iterate through the nested layers of my tree-like dict.
            break
        if qloop == "R":
            continue
        else:
            break

所以,我在我的控制台上要求用户为一个项目(在这个例子中是“id01”)做出选择。假设用户在初始问题之后输入“1”,代码应该打印答案选择A,然后用户可以再次选择,直到到达决策树中的一条路径的末尾,比如dict。
任何想法,我如何才能实现这一点,resp。这将是一个很大的奖金,如果你也可以撤销你的选择逐步让说“R”的关键。

cwdobuhd

cwdobuhd1#

代码中所需的事件链不是很清楚,但我认为您可以使用类似以下函数的东西

def traverse_choices(q_ch:dict): 
    while isinstance(q_ch, dict):
        print(q_ch['0'])
        if (user_resp:=input("Select an option: ")) not in ['R', *q_ch]:
            print('Invalid selection. Please enter a valid option [or "R" to exit].')
            continue
        if user_resp=='R': return 'R'
        if user_resp!='0': q_ch = q_ch[user_resp]
    print(q_ch)

并可能使用它如下

qloop = traverse_choices(data[i]["system"]) ## will return "R" or None
        if qloop != "R": break
        continue ## ONLY IF THERE IS ANYTHING AFTER IT [IN THE OUTER LOOP] TO SKIP
    #### REST OF OUTER LOOP ####

[我假设代码片段中的 * if qloop == "R": continueelse: break * 部分嵌套在另一个循环中的条件块中,因为在无条件breakcontinue之后的循环中没有任何意义...]

关于我们

if qloop == "R":
            continue
        else:
            break

注意,在if...breakif...continue之后不需要使用else;如果循环中break之后没有任何内容,则可以使用if qloop != "R": break

相关问题