我是靠谱客的博主 心灵美啤酒,最近开发中收集的这篇文章主要介绍字典的多级嵌套---三级菜单(三种方式),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

 要求:

     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('33[31;m请选择:33[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)

 

最后

以上就是心灵美啤酒为你收集整理的字典的多级嵌套---三级菜单(三种方式)的全部内容,希望文章能够帮你解决字典的多级嵌套---三级菜单(三种方式)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部