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)