三级菜单(省市县)

zone = {
"北京":{
"昌平":{"沙河":{},"朱辛庄":{},"巩华城":{}},
"朝阳":{"十里堡":{},"大望路":{},"高碑店":{}},
"通州":{"北苑":{},"果园":{},"九棵树":{}}
},
"河北":{
"保定":{"徐水":{},"定州":{},"固城":{}},
"石家庄":{"正定":{},"灵寿":{},"无极":{}},
"张家口":{"张北":{},"宣化":{},"怀安":{}}
},
"山东":{
"青岛":{"四方":{},"黄岛":{},"崂山":{}},
"济南":{"历城":{},"槐荫":{},"章丘":{}},
"烟台":{"龙口":{},"蓬莱":{},"招远":{}}
}
}

}
province = list(zone.keys())
flag = True #1层标志
flag_1=True #2层标志
while flag:
    print("省---------------------")
    a=1
    for i in province:
        print(a,".",i)
        a += 1
    province_1=input("请输入省名,输入q退出!").strip()
    if province_1 in province:
        city = list(zone[province_1].keys())
        while flag_1:
            print("市-----------------------")
            a=1
            for i in city:
                print(a,".",i)
                a += 1
            province_2 = input("请输入市名,输入i返回上一级,输入q退出!").strip()
            if province_2 in city:
                while   True:
                    if province_2 in city:
                        county = list(zone[province_1][province_2])
                        a=1
                        for i in county:
                            print(a,".",i)
                            a += 1
                        choice=input("返回上一级请输入i,退出请输入q!")
                        if choice == "i":
                            break
                        elif choice=="q":
                            flag_1 = False
                            flag=False
                            break
                        else:
                            print("请输入正确的指令!")
            elif province_2 == "i":
                break
            elif province_2 == "q":
                flag = False
                break
            else:
                print("请输入正确的指令!")
    elif province_1=="q":
        break
    else:
        print("请输入正确指令!")

上面的代码是不是感觉有点繁琐,而且重复的代码有点多。下面我们简化下:

now_dict = zone  #当前列表
later_dict=[]    #上一层列表
while True:
    for i in now_dict:
        print(i)
    choice=input(">>>>>")
    if choice in now_dict:  #如果输入的在当前列表里
        later_dict.append(now_dict)  #将当前列表存储进上一层列表中。
        now_dict=now_dict[choice]    #给当前列表重新赋值,下一层列表
    if choice=="i":                  #如果输入的是i,则放回上一层,
        now_dict=later_dict[-1]      #将存储上一层的列表最后一个元素给当前列表赋值。
        later_dict.pop()             #删除最后一个元素
    if choice=="q":                  #输入q,退出
        break 

除了上述的两种方法外,还有递归函数的方法:

def cont(county,dict1): #county存储输入选择的城市名,该城市下属的列表。
a=123                   #输入的指令,开始随意赋值。
while  True:
    if a == "i":break   #跳到上级
    elif a == "q":return a #直接退出
    for i in dict1:print(i) #打印列表
    a = input(">>>>>>:").strip()  #等待输入
    if a in dict1:   #如果输入正确列表里的元素,则递归调用。
        county = a;a=cont(county,dict1[a])
cont(1,zone)
原文地址:https://www.cnblogs.com/G-YUE/p/6652984.html