Python 数组类型转树形结构

今天突然想用到这个功能  结果百度到的  基本是写乱糟糟的一堆代码  无奈只好亲自操刀

话不多说,先上代码:

class Tools:

    @staticmethod
    def list_to_tree(data, pid=0):

        children = [item for item in data if item['pid'] == pid]
        for child in children:
            child['children'] = Tools.list_to_tree(data, child['id'])
        return children


tree = Tools.list_to_tree(data)
print(tree)

 

测试数据如下

data = [
            {
                "id": 1,
                "notice": "订单管理",
                "level": 1,
                "pid": 0,
                "path": "-1"
            },
            {
                "id": 2,
                "notice": "产品管理",
                "level": 1,
                "pid": 0,
                "path": "-2"
            },
            {
                "id": 3,
                "notice": "权限管理",
                "level": 1,
                "pid": 0,
                "path": "-3"
            },
            {
                "id": 4,
                "notice": "订单列表",
                "level": 2,
                "pid": 1,
                "path": "-1-4"
            },
            {
                "id": 5,
                "notice": "退款管理",
                "level": 2,
                "pid": 1,
                "path": "-1-5"
            },
            {
                "id": 6,
                "notice": "产品列表",
                "level": 2,
                "pid": 2,
                "path": "-2-6"
            },
            {
                "id": 7,
                "notice": "产品分类",
                "level": 2,
                "pid": 2,
                "path": "-2-7"
            },
            {
                "id": 8,
                "notice": "用户管理",
                "level": 2,
                "pid": 3,
                "path": "-3-8"
            },
            {
                "id": 9,
                "notice": "角色管理",
                "level": 2,
                "pid": 3,
                "path": "-3-9"
            },
            {
                "id": 10,
                "notice": "菜单管理",
                "level": 2,
                "pid": 3,
                "path": "-3-10"
            }
        ]

  

结果:

[{'id': 1, 'notice': '订单管理', 'level': 1, 'pid': 0, 'path': '-1', 'children': [{'id': 4, 'notice': '订单列表', 'level': 2, 'pid': 1, 'path': '-1-4', 'children': []}, {'id': 5, 'notice': '退款管理', 'level': 2, 'pid': 1, 'path': '-1-5', 'children': []}]}, {'id': 2, 'notice': '产品管理', 'level': 1, 'pid': 0, 'path': '-2', 'children': [{'id': 6, 'notice': '产品列表', 'level': 2, 'pid': 2, 'path': '-2-6', 'children': []}, {'id': 7, 'notice': '产品分类', 'level': 2, 'pid': 2, 'path': '-2-7', 'children': []}]}, {'id': 3, 'notice': '权限管理', 'level': 1, 'pid': 0, 'path': '-3', 'children': [{'id': 8, 'notice': '用户管理', 'level': 2, 'pid': 3, 'path': '-3-8', 'children': []}, {'id': 9, 'notice': '角色管理', 'level': 2, 'pid': 3, 'path': '-3-9', 'children': []}, {'id': 10, 'notice': '菜单管理', 'level': 2, 'pid': 3, 'path': '-3-10', 'children': []}]}]

 

衍生出来一个算法题 

obj = {
    'name':'总纲',
    'children': [
        {
            'name': '第一章',
            'children': [
                {
                    'name': "第一节",
                    'children': [
                        {
                            'name': '第一项',
                            'children': [
                                {
                                    'name':'第一列'
                                }
                            ]
                        }
                    ]
                },
                {
                    'name': "第二节",
                    'children': [
                        {
                            'name': '第二项',
                        }
                    ]
                }
            ]
        },
        {
            'name': '第二章',
            'children': [
                {
                    'name': "第三节",
                    'children': [
                        {
                            'name': '第三项'
                        }
                    ]
                }
            ]
        },
        {
            'name': '第三章',
        }
    ]
}

# 输出结果
 ['总纲', '(1)第一章', '(1 1)第一节', '(1 1 1 )第一项', '(1 1 1 1 )第一列', '(1 2)第二节', '(1 2 1 )第二项', '(2)第二章', '(2 1)第三节', '(2 1 1 )第三项', '(3)第三章']

代码解决思路

def print_tree(tree, prefix=""):
    result = []
    result.append(f"{prefix}{tree['name']}")

    if 'children' in tree:
        for i, child in enumerate(tree['children']):
            new_prefix = f"{prefix}{(i + 1)}"
            result.extend(print_tree(child, new_prefix))

    return result

# Example usage
obj = {
    'name': '总纲',
    'children': [
        {
            'name': '第一章',
            'children': [
                {
                    'name': "第一节",
                    'children': [
                        {
                            'name': '第一项',
                            'children': [
                                {
                                    'name': '第一列'
                                }
                            ]
                        }
                    ]
                },
                {
                    'name': "第二节",
                    'children': [
                        {
                            'name': '第二项'
                        }
                    ]
                }
            ]
        },
        {
            'name': '第二章',
            'children': [
                {
                    'name': "第三节",
                    'children': [
                        {
                            'name': '第三项'
                        }
                    ]
                }
            ]
        },
        {
            'name': '第三章'
        }
    ]
}

output = print_tree(obj)
print(output)

 

posted @ 2024-07-10 21:03  rianley  阅读(20)  评论(0编辑  收藏  举报