字典的多级嵌套---三级菜单(三种方式)

 要求:

     1.可以进入子菜单

     2.可以返回上一级

     3.可以从任意一级直接退出

 遇到的困难:

  1. 如何返回上一级(三种里用了return,break,和全局变量三种) 
  2. 怎么在最上一层时按'b'(返回)能保持不动,在最后一层时继续输入下一个能不出错

字典的多级嵌套:[key for key in data] >>>['山东','江苏'] ,用循环遍历多级字典时只会返回一级,用[key for key in data['山东']]>>['青岛',‘济南’,‘烟台’]

基础版:

data = {
        '山东': {
            '青岛': ['四方', '黄岛', '崂山', '李沧', '城阳'],
            '济南': ['历城', '槐荫', '高新', '长青', '章丘'],
            '烟台': ['龙口', '莱山', '牟平', '蓬莱', '招远']
        },
        '江苏': {
            '苏州': ['沧浪', '相城', '平江', '吴中', '昆山'],
            '南京': ['白下', '秦淮', '浦口', '栖霞', '江宁'],
            '无锡': ['崇安', '南长', '北塘', '锡山', '江阴']
        },
    }

exit_flag = False  # 设置全局变量,用来退出循环,实现任意一级菜单都可以退出
while not exit_flag:
    for i1 in data:  # 读取第一级菜单
        print(i1)
    choice = input('选择进入1,第一级,按q退出:')
    if choice in data:
        while not exit_flag:
            for i2 in data[choice]:  # 读取第二级菜单
                print(i2)
            choice2 = input('选择进入2,按b返回上一级,按q退出:')
            if choice2 in data[choice]:
                while not exit_flag:
                    for i3 in data[choice][choice2]:  # 读取第三级菜单
                        print(i3)
                    choice3 = input('选择进入3,按b返回上一级,按q退出:')
                    if choice3 in data[choice][choice2]:
                        for i4 in data[choice][choice2][choice3]:
                            print(i4)
                        choice4 = input('最后一层,按b返回上一级,按q退出:')
                        if choice4 == 'b':
                            pass  # 占位符
                        if choice4 == 'q':
                            exit_flag = True
                    if choice3 == 'b':
                        break
                    if choice3 == 'q':
                        exit_flag = True
            if choice2 == 'b':
                break
            if choice2 == 'q':
                exit_flag = True
    if choice == 'q':
        exit_flag = True

 

 递归版:

# 用递归写三级菜单
# 此程序有两个问题,一是最顶端时输入“b”会直接退出,二是到最后一层再往下输时也会出错

# 用递归写三级菜单
# 此程序有两个问题,一是最顶端时返回会出错,二是到最后一层再往下输时也会出错

def fact_dict(logs, counts):
    while True:
        print('请输入进入地区,输入b返回上层菜单,输入q退出'.center(40, '-'))
        name_lst = [key for key in logs]
        print('\n'.join(name_lst))
       
        print(type(logs))

        choice = input('\033[31;m请选择:\033[0m')
        if choice in name_lst:
            fact_dict(logs[choice])
        elif choice == 'b':  # 返回上一级菜单
            return           # return表示返回上一级

        elif choice == 'q':
            exit()

        else:
            print("Input Error")


if __name__ == '__main__':
    log = {
        '山东': {
            '青岛': ['四方', '黄岛', '崂山', '李沧', '城阳'],
            '济南': ['历城', '槐荫', '高新', '长青', '章丘'],
            '烟台': ['龙口', '莱山', '牟平', '蓬莱', '招远']
        },
        '江苏': {
            '苏州': ['沧浪', '相城', '平江', '吴中', '昆山'],
            '南京': ['白下', '秦淮', '浦口', '栖霞', '江宁'],
            '无锡': ['崇安', '南长', '北塘', '锡山', '江阴']
        },
    }
    fact_dict(log, count)

 

类+递归版(借鉴的别人的,个人比较喜欢这版):

  1. 到第三层时,会直接输出第三层后继续输出第二层(解决了输出最后一层再往下输可能会出错的问题,但是解决方式不喜欢,换)
  2. 解决了第一层输入“b”会出错的问题(感觉很强!定义一个self.menus=menu,则self.menus保持不变,一直都是最开始的字典)
class menu(object):
    def __init__(self, menus):
        self.menus = menus

    def view_dict(self, menu):
        print('请输入进入地区,输入"b"返回上层菜单,输入"q"退出'.center(40, '-'))
        print('\n'.join([str(key) for key in menu]))
        choice = input("请选择>>:")
        if choice == 'q':
            exit()
        elif choice == 'b':
            if menu != self.menus:   #self.menus是最开始的menu,表示那个多级字典
                return
            else:
                print('已经是最顶层目录,请选择或退出,谢谢'.center(40, ' '))
                self.view_dict(menu)
        elif choice in [key for key in menu]:
            if type(menu[choice]).__name__ == 'dict':
                self.view_dict(menu[choice])
                self.view_dict(menu)
            else:
                print('\n'.join([item for item in menu[choice]]))
                print('已经是最后一层,返回请输入"b",退出请输入"q",谢谢!'.center(40, '*'))
                self.view_dict(menu)
        else:
            print('请输入正确口令,谢谢!')
            self.view_dict(menu)


if __name__ == '__main__':
    zone = {
        '山东': {
            '青岛': ['四方', '黄岛', '崂山', '李沧', '城阳'],
            '济南': ['历城', '槐荫', '高新', '长青', '章丘'],
            '烟台': ['龙口', '莱山', '牟平', '蓬莱', '招远']
        },
        '江苏': {
            '苏州': ['沧浪', '相城', '平江', '吴中', '昆山'],
            '南京': ['白下', '秦淮', '浦口', '栖霞', '江宁'],
            '无锡': ['崇安', '南长', '北塘', '锡山', '江阴']
        },
    }

    view = menu(zone)
    view.view_dict(zone)

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值