Python的字典练习-三级菜单

需求说明

  • 打印省、市、县三级菜单
  • 可返回上一级
  • 可随时退出程序
  • 参考的字典样例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
province_city = {
'河北': {
'石家庄': ['长安区', '桥东区', '桥西区', '新华区', '井陉矿区', '裕华区', '井陉县', '正定县', '栾城县', '其他'],
'唐山': ['路南区', '路北区', '古冶区', '开平区', '丰南区', '丰润区', '滦县', '滦南县', '乐亭县', '迁西县', '其他'],
'秦皇岛': ['海港区', '山海关区', '北戴河区', '青龙满族自治县', '昌黎县', '抚宁县', '卢龙县', '其他'],
'衡水': ['桃城区', '枣强县', '武邑县', '武强县', '饶阳县', '安平县', '故城县', '景县', '阜城县', '冀州市', '其他']
},
'山西': {
'太原': ['小店区', '迎泽区', '杏花岭区', '尖草坪区', '万柏林区', '晋源区', '清徐县', '阳曲县', '娄烦县', '古交市', '其他'],
'大同': ['城区', '矿区', '南郊区', '新荣区', '阳高县', '天镇县', '广灵县', '灵丘县', '浑源县', '左云县', '大同县', '其他'],
'吕梁': ['离石区', '文水县', '交城县', '兴县', '临县', '柳林县', '石楼县', '岚县', '方山县', '交口县', '汾阳市', '其他']
},
'内蒙古': {
'呼和浩特': ['新城区', '回民区', '玉泉区', '玉泉区', '赛罕区', '土默特左旗', '托克托县', '和林格尔县', '清水河县', '其他'],
'包头': ['东河区', '昆都仑区', '青山区', '石拐区', '白云矿区', '九原区', '土默特右旗', '固阳县', '达尔罕茂明安联合旗', '其他'],
'阿拉善': ['阿拉善左旗', '阿拉善右旗', '额济纳旗', '其他']
}
}

示范代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

province_city = {
'河北': {
'石家庄': ['长安区', '桥东区', '桥西区', '新华区', '井陉矿区', '裕华区', '井陉县', '正定县', '栾城县', '其他'],
'唐山': ['路南区', '路北区', '古冶区', '开平区', '丰南区', '丰润区', '滦县', '滦南县', '乐亭县', '迁西县', '其他'],
'秦皇岛': ['海港区', '山海关区', '北戴河区', '青龙满族自治县', '昌黎县', '抚宁县', '卢龙县', '其他'],
'衡水': ['桃城区', '枣强县', '武邑县', '武强县', '饶阳县', '安平县', '故城县', '景县', '阜城县', '冀州市', '其他']
},
'山西': {
'太原': ['小店区', '迎泽区', '杏花岭区', '尖草坪区', '万柏林区', '晋源区', '清徐县', '阳曲县', '娄烦县', '古交市', '其他'],
'大同': ['城区', '矿区', '南郊区', '新荣区', '阳高县', '天镇县', '广灵县', '灵丘县', '浑源县', '左云县', '大同县', '其他'],
'吕梁': ['离石区', '文水县', '交城县', '兴县', '临县', '柳林县', '石楼县', '岚县', '方山县', '交口县', '汾阳市', '其他']
},
'内蒙古': {
'呼和浩特': ['新城区', '回民区', '玉泉区', '玉泉区', '赛罕区', '土默特左旗', '托克托县', '和林格尔县', '清水河县', '其他'],
'包头': ['东河区', '昆都仑区', '青山区', '石拐区', '白云矿区', '九原区', '土默特右旗', '固阳县', '达尔罕茂明安联合旗', '其他'],
'阿拉善': ['阿拉善左旗', '阿拉善右旗', '额济纳旗', '其他']
}
}


current_layer = province_city # 当前层就是初始层,用来实现动态循环
parent_list = [] # 保存所有父级元素,最后一个元素永远都是父亲级

while True:
for key in current_layer: # 遍历当前层的所有元素并打印之
print(key)

user_choice = input('输入名称进行选择,返回上一级请按b,退出请按q >> ') # 引导用户进行选择

if user_choice in current_layer:
if type(current_layer) is list: # 根据最后一层是列表对象的特点判断
print('\033[0;31m已经是最后一层了\033[0m')
else:
parent_list.append(current_layer) # 即将进入下一层,当前层作为父级元素追加到列表
current_layer = current_layer[user_choice] # 当前层赋值为当前层的下一层数据
elif user_choice == 'b':
if parent_list: # 如果父级元素为空则不做任何操作
current_layer = parent_list.pop() # 删除并返回列表的最后一个元素,及父层元素
elif user_choice == 'q':
exit('退出')
else:
print('输入的内容 \033[0;31m%s\033[0m 不正确' % user_choice)
有钱任性,请我吃包辣条
0%