三级列表:

menu = {
    '北京':{
        '海淀':{
            '五道口':{
                'soho':{},
                '网易':{},
                'google':{}
            },
            '中关村':{
                '爱奇艺':{},
                '汽车之家':{},
                'youku':{},
            },
            '上地':{
                '百度':{},
            },
        },
        '昌平':{
            '沙河':{
                '地铁':{},
                '北航':{},
            },
            '天通苑':{},
            '回龙观':{},
        },
        '朝阳':{},
        '东城':{},
    },
    '上海':{
        '闵行':{
            "人民广场":{
                '炸鸡店':{}
            }
        },
        '闸北':{
            '火车站':{
                '携程':{}
            }
        },
}

 基础版本:

#首先要有个死循环,能够一直的输入
while True:
    #打印第一层的数据
    for key in menu:
        print(key)
    #然后叫用户选择
    choice = input(">>:").strip()#去掉空格
    #判断是否是回车
    if choice == 'b':break
    if choice == 'q':exit("欢迎下次再来")
    if len(choice) ==0:continue#避免输入空格

    print("------进入下一级------".center(50))
    #第一,确保北京在字典里,有一个key,有,直接调这个key,进入下一级

    #判断字典有没有这个值,有get和in两种方法
    if choice not in menu:continue#如果不在里面继续往里输,跳过这次选择

    #为下一层循环单独加一个循环
    while True:
        #先把下一层取到
        for key2 in menu[choice]:
            print(key2)

        choice2 = input(">>:").strip()
        if choice2 == 'b': break
        if choice2 == 'q': exit("欢迎下次再来{name}".format(name=choice2))
        if len(choice2) ==0:continue
        if choice2 not in menu[choice]:continue#判断用户输入的选项如果没在第这层菜单中,跳出

        # 为下一层循环单独加一个循环
        while True:
            # 先把下一层取到
            for key3 in menu[choice][choice2]:
                print(key3)

            choice3 = input(">>:").strip()
            if choice3 == 'b': break
            if choice3 == 'q': exit("欢迎下次再来")
            if len(choice3) == 0: continue
            if choice3 not in menu[choice][choice2]: continue  # 判断用户输入的选项如果没在第这层菜单中,跳出

            while True:
                # 先把下一层取到
                for key4 in menu[choice][choice2][choice3]:
                    print(key4)

                choice4 = input(">>:").strip()
                if choice4 == 'b': break
                if choice4 == 'q': exit("欢迎下次再来")
                if len(choice4) == 0: continue
                if choice4 not in menu[choice][choice2][choice3]: continue  # 判断用户输入的选项如果没在第这层菜单中,跳出

 

优化之后,高级版本:

current_level = menu #当前层 #初始变量
last_level = [] #定义空列表,返回上一级用的,每进入一层就存一层
while True:
    for key in current_level:#循环每一层
        print(key)
    choice = input(">>:").strip()
    if len(choice) == 0:continue

    # 返回上一层
    # 自己记住每层的上一层,每次在进入下一层之前,我当前层就相当于下一层的父集
    if choice == 'b':
    #    current_level = last_level#把当前层的变量改成上一层[把当前层改成父亲层,这样下一次循环就回到上一层]
        if not last_level :break #if len(last_level) == 0:break
        current_level = last_level[-1]#每退出一层取列表最后一个值
        last_level.pop()#删一层
    if choice not in current_level:continue
    #choice在里面进入下一层
    last_level.append(current_level)#每进一层存一层
    current_level = current_level[choice]#给current_level重新赋值,进入下一层,每换一个变量,下一次就到了for key in current_level层

 完毕。

posted on 2016-10-26 14:43  Beirut  阅读(454)  评论(0编辑  收藏  举报