You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 17:50:44