知识内容:
1.三级菜单普通版
2.三级菜单递归版
一、三级菜单普通版
需求:
- 可依次选择进入各子菜单
- 可从任意一层往回退到上一层
- 可从任意一层退出程序
- 所需新知识点:列表、字典
数据结构:
1 menu = { 2 '北京': { 3 '海淀':{ 4 '五道口':{ 5 'soho':{}, 6 '网易':{}, 7 'google':{} 8 }, 9 '中关村':{ 10 '爱奇艺':{}, 11 '汽车之家':{}, 12 'youku':{}, 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 }
代码:
第一版: 实现所有功能
1 menu = { 2 '北京': { 3 '海淀':{ 4 '五道口':{ 5 'soho':{}, 6 '网易':{}, 7 'google':{} 8 }, 9 '中关村':{ 10 '爱奇艺':{}, 11 '汽车之家':{}, 12 'youku':{}, 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 k = [menu] 45 46 while True: 47 t = k[-1] 48 s = list(t) 49 for i in s: 50 print(i, end="") 51 choice = input(" 请选择(q退出, b返回上一层): ").strip() 52 if choice in s: 53 d = t[choice] 54 k.append(d) 55 elif choice == 'q': 56 break 57 elif choice == 'b': 58 k.pop() 59 elif choice not in s: 60 continue
第二版: 添加了特殊情况的处理以及进一步优化程序
1 menu = { 2 '北京': { 3 '海淀':{ 4 '五道口':{ 5 'soho':{}, 6 '网易':{}, 7 'google':{} 8 }, 9 '中关村':{ 10 '爱奇艺':{}, 11 '汽车之家':{}, 12 'youku':{}, 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 dicts = [] 45 46 while True: 47 # dicts是存储了字典的列表,keys是存储字典的key的列表 48 keys = list(menu.keys()) 49 # 到了最底层 50 if len(menu) == 0: 51 # 倒退一步,实现如果无可选择的项就无法往下走 52 menu = dicts.pop() 53 print("无可选择的选项!请选择退出或返回上一层", end="") 54 # 未到最低层 55 else: 56 # 输出某层的信息 57 for i in keys: 58 print(i, end="") 59 60 # 输入选择信息: 61 choice = input(" 请选择(q退出, b返回上一层): ").strip() 62 63 # 输入判断: 64 # 输入为空 65 if not choice: 66 continue 67 # 进入下一层 68 elif choice in keys: 69 # 保存上一层 70 dicts.append(menu) 71 # 进入下一层 72 menu = menu[choice] 73 # 直接退出程序 74 elif choice == 'q': 75 break 76 # 返回上一层 77 elif choice == 'b': 78 if len(dicts) == 0: 79 print("已到最上层无法再回退,请选择退出或进入下一层") 80 else: 81 menu = dicts.pop() 82 # 输入的信息为错误信息: 83 else: 84 print("请输入正确的信息!")
二、三级菜单递归版
需求:
(1)打印所有的节点 -> text中的内容
(2)输入一个节点名称,遍历,找到了就打印它并返回True,否则返回False
数据结构:
1 menu = [ 2 { 3 'text': '北京', 4 'children': [ 5 {'text': '朝阳', 'children': []}, 6 {'text': '昌平', 'children': [ 7 {'text': '沙河', 'children': []}, 8 {'text': '回龙观', 'children': []}, 9 ]}, 10 ] 11 }, 12 { 13 'text': '上海', 14 'children': [ 15 {'text': '宝山', 'children': []}, 16 {'text': '金山', 'children': []}, 17 ] 18 }, 19 ]
代码:
需求1:
1 menu = [ 2 { 3 'text': '北京', 4 'children': [ 5 {'text': '朝阳', 'children': []}, 6 {'text': '昌平', 'children': [ 7 {'text': '沙河', 'children': []}, 8 {'text': '回龙观', 'children': []}, 9 ]}, 10 ] 11 }, 12 { 13 'text': '上海', 14 'children': [ 15 {'text': '宝山', 'children': []}, 16 {'text': '金山', 'children': []}, 17 ] 18 }, 19 ] 20 21 22 def show_test(m): 23 for item in m: 24 text = item.get("text", None) 25 if text: 26 print(text) 27 children = item.get("children", None) 28 if children: 29 show_test(children) 30 if children is []: 31 return 32 33 34 show_test(menu)
需求2:
1 def show_test(m, n): 2 for item in m: 3 text = item.get("text", None) 4 if text == n: 5 print(text) 6 return True 7 children = item.get("children", None) 8 if children: 9 show_test(children, n) 10 if children is []: 11 return 12 return False 13 14 15 node = input("请输入节点名称: ") 16 print(show_test(menu, node))