程序要求:
1. 使用字典存储
1. 可以一层一层的进入到所有层
2. 可以在每层返回上一层
3. 可以在任意层退出
三级目录写了两个版本,第一个版本是刚看完字典写出来的,代码很多冗余,很多重复。
menu = { '北京':{ '朝阳':{ '国贸':{ 'CICC':{}, 'HP':{}, '渣打银行':{}, 'CCTV':{} }, '望京':{ '陌陌':{}, '阿里巴巴':{}, '奔驰':{} }, '三里屯':{ '优衣库':{}, 'apple':{}, } }, '昌平':{ '沙河':{ '老男孩':{}, '阿泰包子':{} }, '天通苑':{ '链家':{}, '我爱我家':{}, }, '回龙观':{} }, '海淀':{ '五道口':{ '谷歌':{}, '网易':{}, 'Sogo':{}, '快手':{}, }, }, '中关村':{ '优酷':{}, '爱奇艺':{}, '腾讯':{}, '汽车之家':{}, '新东方':{}, } }, '上海':{ '浦东':{ '陆家嘴':{ 'CICC':{}, '高盛':{}, '摩根':{}, }, '外滩':{} }, '闵行':{}, '静安':{}, }, '山东':{ '济南':{}, '德州':{ '乐陵':{ '丁务镇':{}, '城区':{}, }, '虞城':{}, '平原县':{}, }, '青岛':{}, } } back_flag = False quit_flag = False while not back_flag and not quit_flag: for key in menu: print(key) choice = input('>>:').strip() if choice in menu: while not back_flag and not quit_flag: for key_2 in menu[choice]: print(key_2) choice_2 = input('2>>:').strip() if choice_2 == 'b': back_flag = True if choice_2 == 'q': quit_flag = True if choice_2 in menu[choice]: while not back_flag and not quit_flag: for key_3 in menu[choice][choice_2]: print(key_3) choice_3 = input('3>>:').strip() if choice_3 == 'b': back_flag = True if choice_3 == 'q': quit_flag = True if choice_3 in menu[choice][choice_2]: while not back_flag and not quit_flag: for key_4 in menu[choice][choice_2][choice_3]: print(key_4) print('last level!!') choice_4 = input('4>>:').strip() if choice_4 == 'b': back_flag = True if choice_4 == 'q': quit_flag = True else: back_flag = False else: back_flag = False else: back_flag = False
第二个版本,代码部分比较精炼,偷师于老男孩。
menu = { '北京':{ '朝阳':{ '国贸':{ 'CICC':{}, 'HP':{}, '渣打银行':{}, 'CCTV':{} }, '望京':{ '陌陌':{}, '阿里巴巴':{}, '奔驰':{} }, '三里屯':{ '优衣库':{}, 'apple':{}, } }, '昌平':{ '沙河':{ '老男孩':{}, '阿泰包子':{} }, '天通苑':{ '链家':{}, '我爱我家':{}, }, '回龙观':{} }, '海淀':{ '五道口':{ '谷歌':{}, '网易':{}, 'Sogo':{}, '快手':{}, }, }, '中关村':{ '优酷':{}, '爱奇艺':{}, '腾讯':{}, '汽车之家':{}, '新东方':{}, } }, '上海':{ '浦东':{ '陆家嘴':{ 'CICC':{}, '高盛':{}, '摩根':{}, }, '外滩':{} }, '闵行':{}, '静安':{}, }, '山东':{ '济南':{}, '德州':{ '乐陵':{ '丁务镇':{}, '城区':{}, }, '虞城':{}, '平原县':{}, }, '青岛':{}, } } lader = menu apper_levels = [] while True: for key in lader: print(key) choice = input('>>>:').strip() if choice in lader: apper_levels.append(lader) # 次步是重点,第一次执行便将字典以列表的形式保存,每进入一层,便将父级目录追加到后边,用于退出次层时直接提取,保证永远包含字典,并进一层,追加一层。 lader = lader[choice] elif choice == 'q': if apper_levels: lader = apper_levels.pop() # 提取的是进入某层后的上一层信息,是在上边标注的地方进行的追加。
2. 使用文件存储数据
1. 展示省市县(数据存在文件中)
2. 对菜单实现增(add)删(del)改(replace)查(到某一级目录可以让用户选择增加是否添加当级目录的省市县,还是存放到文本中)
程序涉及方法:
字符串转为字典
a = str({'bj':{'1':111}}) print(type(a)) print(a) a = eval(a) print(type(a))
程序使用字典文件(文件名china):
{ '北京':{ '朝阳':{ '国贸':{}, '望京':{}, '三里屯':{} }, '昌平':{ '沙河':{}, '天通苑':{}, '回龙观':{} }, '海淀':{ '五道口':{}, }, '中关村':{} }, '上海':{ '浦东':{ '陆家嘴':{}, '外滩':{} }, '闵行':{}, '静安':{}, }, '山东':{ '济南':{}, '德州':{ '乐陵':{}, '虞城':{}, '平原县':{}, }, '青岛':{}, } }
程序代码:
with open('china', 'r', encoding='utf8') as file: china_str = file.read().strip() pass mean = eval(china_str) leader = mean apper_leves = [] # 用于记录返回值 flag = False while not flag: for key in leader: print(key) choose = input('此页面支持增加(add)、删除(del)、修改(replace)、查看(直接输入省市县)、后退请按"b":') # 查询 if choose in leader: apper_leves.append(leader) leader = leader[choose] # 增加 elif choose == 'add': user_add = input('输入想要增加的地区:') if user_add in leader: print('输入的已存在!') else: leader[user_add] = {} # 删除 elif choose == 'del': user_del = input('输入想要删除的地区:') if user_del not in leader: print('删除地区不存在!') else: del leader[user_del] # 修改 elif choose == 'replace': user_rep_bef = input('请输入想要修改的地区:') if user_rep_bef not in leader: print('修改地区不存在!') else: user_rep_aft = input('请输入修改后的地区名称:') leader[user_rep_aft] = leader[user_rep_bef] # 重点,将老键的值赋给新键,并删除老键 del leader[user_rep_bef] # 后退及退出 elif choose == 'b': if apper_leves: leader = apper_leves.pop() else: print('已是最上级菜单,输入“b”退出') # 重点,如直接退出,字典并没有返回最上级目录,无法输出到文件 flag = True else: print('非法输入,请重新输入!') with (open('old_wang', 'w', encoding='utf8')) as f: f.write(str(leader)) pass