美文网首页
python树形递归.md

python树形递归.md

作者: 未然猜 | 来源:发表于2019-10-30 10:51 被阅读0次
    import copy
    
    def filter_menu_data(menu_list):
        """菜单数据结构"""
        # 构造字典结构
        menu_dict = {}
        for menu in menu_list:
            menu_dict[menu['id']] = menu
    
        def get_children_recursion(item):
            """获取子节点"""
            item_children = item.setdefault('children', [])
            # 该节点的所有子节点
            children = [i for i in menu_list if item['id'] == i['parent_id']]
            for child in children:
                # 添加子节点
                item_children.append(child)
                # 递归子节点
                get_children_recursion(child)
    
        def clear_field(item):
            """清理多余字段"""
            # item.pop('id')
            item.pop('parent_id')
            # item.pop('order_num')
            # item.pop('menu_type')
            for child in item.get('children', []):
                clear_field(child)
            if not item.get('children', []):
                item.pop('children')
            return item
    
        # 最终结果值
        result = []
        for menu in menu_list:
            # 从导航栏开始递归
            if menu['parent_id'] == 0:
                # 浅拷贝
                get_children_recursion(menu)
                # 深拷贝
                items = clear_field(copy.deepcopy(menu))
                result.append(items)
        for i in result:
            print(i, end='\n\n')
    
    
    
    if __name__ == '__main__':
        conf = {
            'host': 'localhost',
            'port': 3306,
            'user': '****',
            'password': '****',
            'db': '****'
        }
    
        db = MysqlLink(conf)
        # 查询全部
        result = db.query('''
        SELECT id, menu_name, parent_id, order_num, menu_type
        FROM tb_user_menu
        WHERE is_deleted = 0''')
        print(result)
        print()
        filter_menu_data(result)
    

    结果集

    # 查询数据
    {'id': 1, 'menu_name': '任务总览', 'parent_id': 0, 'order_num': 0, 'menu_type': 1}
    {'id': 2, 'menu_name': '调度总览', 'parent_id': 0, 'order_num': 1, 'menu_type': 1}
    {'id': 3, 'menu_name': '基础配置', 'parent_id': 0, 'order_num': 2, 'menu_type': 1}
    {'id': 4, 'menu_name': '接口配置', 'parent_id': 1, 'order_num': 0, 'menu_type': 2}
    {'id': 5, 'menu_name': '任务配置', 'parent_id': 1, 'order_num': 1, 'menu_type': 2}
    {'id': 6, 'menu_name': '接口列表', 'parent_id': 4, 'order_num': 0, 'menu_type': 3}
    {'id': 8, 'menu_name': '任务列表', 'parent_id': 5, 'order_num': 0, 'menu_type': 3}
    {'id': 10, 'menu_name': '调度配置', 'parent_id': 2, 'order_num': 0, 'menu_type': 2}
    {'id': 11, 'menu_name': '运行日志', 'parent_id': 2, 'order_num': 1, 'menu_type': 2}
    {'id': 12, 'menu_name': '调度列表', 'parent_id': 10, 'order_num': 0, 'menu_type': 3}
    {'id': 14, 'menu_name': '执行列表', 'parent_id': 11, 'order_num': 0, 'menu_type': 3}
    {'id': 15, 'menu_name': '执行服务器配置', 'parent_id': 3, 'order_num': 0, 'menu_type': 2}
    {'id': 16, 'menu_name': '预警配置', 'parent_id': 3, 'order_num': 1, 'menu_type': 2}
    {'id': 17, 'menu_name': '执行服务器列表', 'parent_id': 15, 'order_num': 0, 'menu_type': 3}
    {'id': 19, 'menu_name': '预警配置列表', 'parent_id': 16, 'order_num': 0, 'menu_type': 3}
    {'id': 21, 'menu_name': '执行服务器状态', 'parent_id': 15, 'order_num': 1, 'menu_type': 3}
    {'id': 22, 'menu_name': '参数配置', 'parent_id': 5, 'order_num': 3, 'menu_type': 3}
    {'id': 23, 'menu_name': '数据源配置', 'parent_id': 5, 'order_num': 2, 'menu_type': 3}
    # 递归结果
    {'id': 1, 'menu_name': '任务总览', 'order_num': 0, 'menu_type': 1, 'children': [{'id': 4, 'menu_name': '接口配置', 'order_num': 0, 'menu_type': 2, 'children': [{'id': 6, 'menu_name': '接口列表', 'order_num': 0, 'menu_type': 3}]}, {'id': 5, 'menu_name': '任务配置', 'order_num': 1, 'menu_type': 2, 'children': [{'id': 8, 'menu_name': '任务列表', 'order_num': 0, 'menu_type': 3}, {'id': 22, 'menu_name': '参数配置', 'order_num': 3, 'menu_type': 3}, {'id': 23, 'menu_name': '数据源配置', 'order_num': 2, 'menu_type': 3}]}]}
    
    {'id': 2, 'menu_name': '调度总览', 'order_num': 1, 'menu_type': 1, 'children': [{'id': 10, 'menu_name': '调度配置', 'order_num': 0, 'menu_type': 2, 'children': [{'id': 12, 'menu_name': '调度列表', 'order_num': 0, 'menu_type': 3}]}, {'id': 11, 'menu_name': '运行日志', 'order_num': 1, 'menu_type': 2, 'children': [{'id': 14, 'menu_name': '执行列表', 'order_num': 0, 'menu_type': 3}]}]}
    
    {'id': 3, 'menu_name': '基础配置', 'order_num': 2, 'menu_type': 1, 'children': [{'id': 15, 'menu_name': '执行服务器配置', 'order_num': 0, 'menu_type': 2, 'children': [{'id': 17, 'menu_name': '执行服务器列表', 'order_num': 0, 'menu_type': 3}, {'id': 21, 'menu_name': '执行服务器状态', 'order_num': 1, 'menu_type': 3}]}, {'id': 16, 'menu_name': '预警配置', 'order_num': 1, 'menu_type': 2, 'children': [{'id': 19, 'menu_name': '预警配置列表', 'order_num': 0, 'menu_type': 3}]}]}
    

    相关文章

      网友评论

          本文标题:python树形递归.md

          本文链接:https://www.haomeiwen.com/subject/yfhovctx.html