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)