首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python——三级菜单(字典的应用)

代码语言:javascript
复制
最近几天在做的一个题目:
三级菜单,按省、市、县三级做一个查询菜单,要求如下,
1.可逐级查询(比如输入山东省,跳出山东所有市,再输入青岛市,可展示青岛所有县)
2.输入b可以返回上一层,比如莱西一级,输入b返回上级青岛,再输入b返回山东。
3.输入q退出。

想了许久,感觉这题目用函数,递归思路很简单。但是如果还没学函数的情况下,写了n个小时,我崩溃了,各种循环,跳转。一定是哪里出问题了,果然,积硅步至千里之外。n个elif和flag,看着就晕,这种代码就不贴了。直接贴一下网上的答案吧(各省份城市比较多,就随便列级两个直辖市中的一部分市县吧):

#!/usr/bin/env python3.6
# -*- coding: utf-8 -*-
menu={
    '北京市':{
        '北京市辖区':{
            '东城区':{},
            '西城区':{},
            '朝阳区':{},
            '丰台区':{},
            '石景山区':{},
            },
        '北京市县':{
            '密云县':{},
            '延庆县':{},
            },
        },

    '天津市':{
        '天津市辖区':{
            '天津市':{},
            '和平区':{},
            '河东区':{},
            '河西区':{},
            '南开区':{},
            '河北区':{},
            },
        '天津市县':{
            '宁河县':{},
            '静海县':{},
            '蓟县':{},
            },
        },

    }
current_layer=menu
parent_layers=[]
while True:

    for key in current_layer:
        print(key)
    choice=input('Please input the district(press b/q to back or quit):').strip()
    if len(choice)==0:continue
    if choice in current_layer:
        parent_layers.append(current_layer)
        current_layer=current_layer[choice]
    elif choice=='b':
        if parent_layers:
            current_layer=parent_layers.pop()
    elif choice=='q':
        break
    else:
        print('invalid input,try again please')

思路比较清晰,就是将省、市、县分级放入字典中,根据输入内容,重新赋值父层、子层获取城市;再一个关键点就是返回,使用父层列表的.pop方法,删一层的同时返回该层,不过父层还要靠纪录、回档才知道,我总觉得少了点啥。于是,,,



我思索了许久许久,终于,想出了新的解决方案,代码如下:
#!/usr/bin/env python3.6
代码语言:javascript
复制
# -*- coding: utf-8 -*-
#__author__:  Ed Frey
#Date: 18/7/27

menu = {
    '1001':'北京市',
    '100101':'北京市辖区',
    '10010101':'东城区',
    '10010102':'西城区',
    '10010103':'朝阳区',
    '100102':'北京市县',
    '10010201':'密云县',
    '10010202':'延庆县',
    '1002':'天津市',
    '100201':'天津市辖区',
    '10020102':'和平区',
    '10020103':'河东区',
    '10020104':'河西区',
    '10020105':'南开区',
    '10020106':'河北区',
    '100202':'天津市县',
    '10020203':'宁河县',
    '10020201':'静海县',
    '10020202':'蓟县',
    }
level_len=4
parent_layer='10'
while True:

    current_layer={key:value for key,value in menu.items() if len(key)==level_len and key.startswith(parent_layer)}
    print(list(current_layer.values()))
    choice=input('Please input the district(press b/q to back or quit):').strip()
    if len(choice)==0:continue
    if choice in current_layer.values():
        parent_layer=list(current_layer.keys())[list(current_layer.values()).index(choice)]
        print(parent_layer)
        level_len+=2
    elif choice=='b':
        if level_len-2:
            level_len-=2
            parent_layer=parent_layer[:-2]
    elif choice=='q':
        break
    else:
        print('invalid input,try again please')
 
 有一行代码可能看着有点长,其实很容易明白。
        
 既然省市县可以用字典分级录入,那按级别做一个不同位数的键值,也无可厚非。第一级省份4位数键值,市6位,县8位。根据键值去查找上下级。
 1002——>100202-——>10020203,下一级比上一级多2位数,前面n位相同;
 如果要返回上一级,就更简单了,位数少2个,父层键值也相应少2位。
 根据键值的命名规则,找到上级、下级,轻而易举。
下一篇
举报
领券