Python实现菜单数据多层嵌套分组(需输出为字典)
多层嵌套菜单分组解决方案
问题描述
现有如下格式的菜单数据:
menu_list = [ {'name':'ABC','parent_id':None,'id':5}, {'name':'XYZ','parent_id':5,'id':7}, {'name':'APPLE','parent_id':7,'id':8}, {'name':'Mango','parent_id':5,'id':9}, {'name':'Mango-small','parent_id':9,'id':10}, ]
需要实现多层嵌套分组,最终输出如下层级结构(同时可生成嵌套字典形式的数据结构):
ABC ----XYZ -------- APPLE ----Mango ----Mango SMALL
解决方案
可以通过构建节点映射表+递归组装层级的方式实现,无需依赖额外复杂库,步骤如下:
1. 构建嵌套层级结构
首先将所有菜单节点存入字典,用id作为键实现快速查找;然后遍历每个节点,将其添加到对应父节点的children列表中,根节点单独提取:
def build_hierarchical_menu(menu_list): # 构建节点映射表:id -> 节点(新增children字段存储子节点) node_map = {} for item in menu_list: node_map[item['id']] = {**item, 'children': []} # 组装层级结构 root_menu = [] for node in node_map.values(): parent_id = node['parent_id'] if parent_id is None: root_menu.append(node) else: node_map[parent_id]['children'].append(node) return root_menu
2. 打印格式化层级菜单
写一个递归函数,根据层级深度添加前缀,实现预期的格式化输出:
def print_menu(menu_items, depth=0): prefix = "----" * depth for item in menu_items: # 按需格式化名称:将Mango-small转为Mango SMALL display_name = item['name'].replace('-', ' ').upper() if item['name'] == 'Mango-small' else item['name'] print(f"{prefix}{' ' if depth > 0 else ''}{display_name}") if item['children']: print_menu(item['children'], depth + 1) # 执行示例 hierarchical_menu = build_hierarchical_menu(menu_list) print_menu(hierarchical_menu)
3. 获取嵌套字典结构
build_hierarchical_menu函数返回的root_menu就是已经嵌套好的字典结构,每个节点包含children字段存储子节点,示例结构如下:
[ { 'name': 'ABC', 'parent_id': None, 'id': 5, 'children': [ { 'name': 'XYZ', 'parent_id': 5, 'id': 7, 'children': [ {'name': 'APPLE', 'parent_id': 7, 'id': 8, 'children': []} ] }, { 'name': 'Mango', 'parent_id': 5, 'id': 9, 'children': [ {'name': 'Mango-small', 'parent_id': 9, 'id': 10, 'children': []} ] } ] } ]
说明
- 该方案支持任意层级的嵌套菜单,不受深度限制
- 节点映射表查询为O(1)时间复杂度,整体执行效率较高
- 可根据需求调整
print_menu中的前缀样式和名称格式化逻辑
内容的提问来源于stack exchange,提问作者saif islam
相关产品推荐
相关产品推荐

