程序要求:

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':{'':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
05-11 22:00