def multi_menu(dict_name, select_list):
temp_dict = dict_name # 先将顶层字典置为当前字典
if select_list: # select_list是将所有的选择项记忆到一个列表中
for layer in select_list:
temp_dict = temp_dict[layer] # 如果列表不为空,那么层层进入,将选中的最底层字典置为当前字典
if type(temp_dict) is dict:
print('-------------------------')
if temp_dict:
for i in temp_dict:
print(i)
else:
print('当前菜单为空')
print('-------------------------')
current_layer = input("退出【e】|返回上一层【b】|增加菜单项【a】|删除【d】\n选择请输入选项:").strip()
if current_layer == "b":
if select_list:
select_list.pop()
return multi_menu(dict_name, select_list) # 递归,重新显示菜单,返回到了上一级
else:
return
elif current_layer == "a":
ipt = input("请输入要增加的项,尾部带>表示子菜单项,不带>表示菜单项:").strip()
if ipt[-1] != '>': # 判断尾部是否带>,如果不是,表示只增加菜单项,菜单项的值是空字符串
temp_dict.setdefault(ipt, '')
else: # 判断尾部是否带>,如果是,表示增加子菜单项,新增的子菜单项,其值是空字典
temp_dict.setdefault(ipt[:-1], {})
return multi_menu(dict_name, select_list) # 递归,重新显示菜单,新增加的菜单项/子菜单会被显示
elif current_layer == "d":
del_key = input("请输入要删除的项")
if del_key in temp_dict.keys():
temp_dict.pop(del_key)
else:
print('项名错误,无项目被删除')
return multi_menu(dict_name, select_list) # 递归,重新显示菜单,被删除的菜单项就没有了
elif current_layer == "e":
return print(f'你选择了:{select_list}') # 退出时,输出选择列表
else:
if current_layer in temp_dict.keys(): # 如果输入的项目在当前字典中
select_list.append(current_layer)
if type(temp_dict[current_layer]) is dict:
return multi_menu(dict_name, select_list) # 如果选择的项仍然有值,则继续显示其子菜单
else:
print(f'你选择了:{select_list}') # 否则表示选择的项无值,已经是底层,则输出所有的选择列表
else:
print(f'你输入的【{current_layer}】不在当前菜单中')
return multi_menu(dict_name, select_list) # 如果输入的项目不在当前字典中,则重新回显
if __name__ == "__main__":
my_dict = {
"北京大学": {
"物理系": {
"20210101班": {"张三": {}, "李四": {}, "王五": {}},
"20210102班": {"赵六": {}, "田七": {}, "周八": {}}
},
"计算机系": {
"20210201班": {"张三": {}, "李四": {}, "王五": {}},
"20210202班": {"赵六": {}, "田七": {}, "周八": {}}
}
},
"上海交通大学": {
"土木系": {
"20210101班": {"张三": {}, "李四": {}, "王五": {}},
"20210102班": {"赵六": {}, "田七": {}, "周八": {}}
},
"铁道系": {
"20210201班": {"张三": {}, "李四": {}, "王五": {}},
"20210202班": {"赵六": {}, "田七": {}, "周八": {}}
}
}
}
multi_menu(my_dict, [])
print(my_dict)