两种无限递归菜单

# 第一种 
res_list = [
        {'cat_id':1,'name':'北京','parent_id':0},
        {'cat_id':2,'name':'杭州','parent_id':0},
        {'cat_id':3,'name':'海淀区','parent_id':1},
        {'cat_id':4,'name':'海淀xx小区','parent_id':3},
        {'cat_id':6,'name':'西湖区','parent_id':2},
        {'cat_id':7,'name':'三墩','parent_id':6},
    ]
  
  # 创建结果集
    res = []
  
  
    def get_tree(data, level=0, parent_id=0, is_clear=True):
       
    # 第一次调用该方法,则清空列表内上次存放的结果
       if is_clear:
            res.clear()
     # 循环匹配
        for item in data:
            if item.get('parent_id') == parent_id:
          # 用于记录当前记录的层级
                item['level'] = level
          # 将结果加入结果集
                res.append(item)
          # 递归调用函数,继续执行,直到匹配完所有结果
                get_tree(data, level=level+1, parent_id=item.get('cat_id'), is_clear=False)
        return res

    get_tree(res_list)
  
 
  # 打印查看效果
    print(res)
    for r in res:
        print('-'*r.get('level')+r.get('name'))


# 第二种
# (注意:可变数据类型:列表list和字典dict;不可变数据类型:整型int、浮点型float、字符串型string和元组tuple。)
res_list = [
        {'cat_id':1,'name':'北京','parent_id':0},
        {'cat_id':2,'name':'杭州','parent_id':0},
        {'cat_id':3,'name':'海淀区','parent_id':1},
        {'cat_id':4,'name':'海淀xx小区','parent_id':3},
        {'cat_id':6,'name':'西湖区','parent_id':2},
        {'cat_id':7,'name':'三墩','parent_id':6},
    ]

def get_son(data):
    # 创建结果集
    res_list = []
    # 创建空树
    tree = {}

    # 将所有分枝加入树中
    for item in data:
        tree[item.get('cat_id')] = item

    for item in data:
        # 若parent_id为0,即为顶级标签,直接存入结果集
        if item.get('parent_id') == 0:
            res_list.append(item)
        else:
            # 获取当前分枝所在的主干
            current_tree = tree.get(item.get('parent_id'))

            if 'children' not in current_tree:
                current_tree['children'] = []

            # 将分支加入主干中
            current_tree.get('children').append(item)
    # 返回结果
    return res_list

# 打印测试
print(get_son(city_list))
 
 
原文地址:https://www.cnblogs.com/hellozizi/p/11816043.html