Python 之 三级菜单

一、 要求

  1. 可依次选择进入各子菜单
  2. 可从任意一层往回退到上一层
  3. 可从任意一层退出程序

二、题目分析与方案

首先给出三级菜单:

menu = {
    "江西省": {
        "南昌市": {"南昌县", "高新县", "新建县"},
        "九江市": {"都昌县", "星子县", "湖口县", "彭泽县"},
        "上饶市": {"广丰县", "余干县", "鄱阳县", "德兴县"}
    },
    "广东省": {
        "深圳市": {"罗湖县", "福田县", "南山县"},
        "清远市": {"清城县", "清新县", "连州县", "佛冈县"},
        "广州市": {"荔湾县", "越秀县", "海珠县", "天河县", "白云县"}
    },
    "河北省": {
        "北京市": {"朝阳县", "丰台县", "石景山县", "海淀县", "门头沟县"},
        "廊坊市": {"安次县", "广阳县", "霸州县", "三河县", "固安县"},
        "承德市": {"双桥县", "双滦县", "平泉县", "承德县"}
    },
    "辽宁省": {
        "大连市": {"中山县", "西岗县", "沙河口县", "甘井子县"},
        "沈阳市": {"和平县", "沈河县", "大东县", "皇姑县", "铁西县"},
        "鞍山市": {"铁东县", "铁西县", "立山县", "千山县", "海城县"}
    }
}

我们通过K-V的形式通过K值能够找到相对应的V值,通过循环的形式可以将菜单中的K值全都打印出来,然后用户输入来的K值,对其操作生成新的字典,将旧字典保留在一个列表中,方便返回的时候使用,同时还要对查询不到的地区或者是极限地区(最上层或最下层)进行处理,具体看代码:

countList = []  # 记录到达每一层的字典
while True:
    for k in menu:
        print(k)
    choice = input("(上一层按“s”,退出按“q”)>>>:").strip()
    if choice in ["s","S"] and len(countList) != 0: # 当换回上一层的时候,countList列表中记录的旧字典替换掉了新字典,并且列表除去旧字典,
                                                    # 也即是列表最后的一个元素永远是当前字典的前身,就是上一级
        menu = countList.pop(-1)
    elif choice in ["q","Q"]:
        exit(0)
    elif choice not in menu or type(menu) is set or (choice in ["s","S"] and len(countList) == 0):
        print("没有发现该地区或者已是最小、最大地区!!!")
    else:
        countList.append(menu) # 每次选择不同的地区都会生成新的字典,此处的作用是记录被新字典替换掉的旧字典
        menu = menu[choice] # 每次的选择都会更新字典

Python 之 三级菜单