zone = {
"北京":{
"昌平":{"沙河":{},"朱辛庄":{},"巩华城":{}},
"朝阳":{"十里堡":{},"大望路":{},"高碑店":{}},
"通州":{"北苑":{},"果园":{},"九棵树":{}}
},
"河北":{
"保定":{"徐水":{},"定州":{},"固城":{}},
"石家庄":{"正定":{},"灵寿":{},"无极":{}},
"张家口":{"张北":{},"宣化":{},"怀安":{}}
},
"山东":{
"青岛":{"四方":{},"黄岛":{},"崂山":{}},
"济南":{"历城":{},"槐荫":{},"章丘":{}},
"烟台":{"龙口":{},"蓬莱":{},"招远":{}}
}
}
}
province = list(zone.keys())
flag = True #1层标志
flag_1=True #2层标志
while flag:
print("省---------------------")
a=1
for i in province:
print(a,".",i)
a += 1
province_1=input("请输入省名,输入q退出!").strip()
if province_1 in province:
city = list(zone[province_1].keys())
while flag_1:
print("市-----------------------")
a=1
for i in city:
print(a,".",i)
a += 1
province_2 = input("请输入市名,输入i返回上一级,输入q退出!").strip()
if province_2 in city:
while True:
if province_2 in city:
county = list(zone[province_1][province_2])
a=1
for i in county:
print(a,".",i)
a += 1
choice=input("返回上一级请输入i,退出请输入q!")
if choice == "i":
break
elif choice=="q":
flag_1 = False
flag=False
break
else:
print("请输入正确的指令!")
elif province_2 == "i":
break
elif province_2 == "q":
flag = False
break
else:
print("请输入正确的指令!")
elif province_1=="q":
break
else:
print("请输入正确指令!")
上面的代码是不是感觉有点繁琐,而且重复的代码有点多。下面我们简化下:
now_dict = zone #当前列表
later_dict=[] #上一层列表
while True:
for i in now_dict:
print(i)
choice=input(">>>>>")
if choice in now_dict: #如果输入的在当前列表里
later_dict.append(now_dict) #将当前列表存储进上一层列表中。
now_dict=now_dict[choice] #给当前列表重新赋值,下一层列表
if choice=="i": #如果输入的是i,则放回上一层,
now_dict=later_dict[-1] #将存储上一层的列表最后一个元素给当前列表赋值。
later_dict.pop() #删除最后一个元素
if choice=="q": #输入q,退出
break
除了上述的两种方法外,还有递归函数的方法:
def cont(county,dict1): #county存储输入选择的城市名,该城市下属的列表。
a=123 #输入的指令,开始随意赋值。
while True:
if a == "i":break #跳到上级
elif a == "q":return a #直接退出
for i in dict1:print(i) #打印列表
a = input(">>>>>>:").strip() #等待输入
if a in dict1: #如果输入正确列表里的元素,则递归调用。
county = a;a=cont(county,dict1[a])
cont(1,zone)