1 # -*- coding: utf-8 -*-
2 # Author: Jason Wang
3
4 # 数据字典定义
5 # 最底层用列表;其他各层是字典的嵌套, 共三层字典嵌套
6
7 dic = \
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 "西南":
46 {
47 "重庆":
48 ["万州区", "涪陵区", "渝中区", "大渡口区"],
49 "四川":
50 ["成都市", "自贡市", "攀枝花市", "德阳市"],
51 "贵州":
52 ["贵阳市", "六盘水市", "遵义市", "安顺市"],
53 },
54 "特别行政区":
55 {
56 "香港":
57 ["屯门", "弯仔", "北角", "西贡"],
58 "澳门":
59 ["花地玛堂区", "圣安多尼堂区", "大堂区", "望德堂区"],
60 },
61 }
62
63 # 声明一个dic_key字典,这个字典会被循环使用并赋值,键是数字1、2、3等,值是dic字典的键,用于将用户输入和dic各层级字典联系起来
64
65 dic_key = {}
66
67 # 一级菜单
68
69
70 def menu1():
71
72 print('一级菜单------中国各省片区分布'.center(40, '~'))
73 dic_key.clear()
74 # 遍历一级菜单
75
76 for index1, key1 in enumerate(dic.keys(), 1): # enumerate第二个参数是为了指定索引起始值为1,用for循环正好是把所有键(不是值)遍历
77
78 # 下面两行是最核心的两行
79 print(index1, key1) # enumerate函数的返回值有两个,一个数字型的索引,一个是遍历所得到的字典键,同时打印出来就得到了菜单
80
81 dic_key[str(index1)] = key1 # 把遍历得到的索引进行类型转换,同时把键赋值给dic_key便于以后使用,例如dic_key[1]="华南"
82
83 choose = input("请选择一级菜单(数字), 输入b返回上一级菜单, 输入退出菜单: ")
84
85 if choose == 'q':
86 quit()
87
88 elif choose == 'b':
89
90 print("此处为一级菜单, 不能返回")
91
92 elif dic_key.get(choose): # 如果用户的输入匹配到dic_key的键
93
94 menu2(dic_key[choose]) # 则将dic_key[choose]的值传递给函数menu2作为传参
95
96 else:
97
98 print("输入有误, 请重新输入!!")
99
100
101 def menu2(choose1):
102
103 print('二级菜单-----省份'.center(40, '~'))
104 dic_key.clear()
105 # 遍历二级菜单
106
107 for index2, key2 in enumerate(dic[choose1].keys(), 1): # 用循环将用户指定的二级字典的键遍历取出
108
109 print(index2, key2)
110
111 dic_key[str(index2)] = key2 # 给dic_key赋值,此时已经是二级菜单的数字和值的对应关系了
112
113 choose2 = input("请选择二级菜单(数字), 输入b返回上一级菜单, 输入q退出菜单")
114
115 if choose2 == 'q':
116 quit()
117
118 elif choose2 == 'b':
119
120 menu1()
121
122 elif dic_key.get(choose2):
123
124 menu3(choose1, dic_key[choose2])
125
126 else:
127
128 print("输入有误, 请重新输入!!")
129 menu2(choose1)
130
131
132 def menu3(choose1, choose2):
133
134 print('三级菜单------地市'.center(40, '~'))
135 # dic_key.clear()
136
137 for i in range(len(dic[choose1][choose2])): # 最后一层是列表,只需要遍历列表的值,并换行显示即可,如果要按固定格式排序,将此层列表换成字典,用key排序
138
139 print(dic[choose1][choose2][i-1])
140
141
142 # dic_key[str(index3)] = key3
143
144 choose3 = input("已经到达三级菜单, 输入b返回上一级菜单, 输入q退出菜单")
145
146 if choose3 == 'q':
147
148 quit()
149
150 elif choose3 == 'b':
151
152 menu2(choose1)
153
154 else:
155 print("输入有误, 请重新输入")
156 menu3(choose1, choose2)
157
158
159 '''
160 一个python的文件有两种使用的方法, 第一是直接作为脚本执行,
161 第二是import到其他的python脚本中被调用(模块重用)执行。
162 if __name__ == 'main': 的作用就是控制这两种情况执行代码的过程,
163 在if __name__ == 'main': 下的代码只有在第一种情况下(即文件作为脚本直接执行)才会被执行,
164 而import到其他脚本中是不会被执行的
165 '''
166
167 # 如果要把字典dic和dict_key的定义放在最后, 则这下面行不能被注释, 可以理解为c中的main函数
168 # if __name__ == '__main__':
169
170 while True:
171
172 menu1()