三级菜单

知识内容:

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("\n请选择(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("\n请选择(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))

 

posted @ 2018-04-12 22:55  woz333333  阅读(211)  评论(0编辑  收藏  举报