最近几天在做的一个题目:
三级菜单,按省、市、县三级做一个查询菜单,要求如下,
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
# -*- 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位。
根据键值的命名规则,找到上级、下级,轻而易举。