python – 将树列表转换为层次结构dict

创建测试用例

class Node:
    def __init__(self, parent, name):
        self.parent = parent
        self.name = name

# 创建一个根节点对象
root = Node(None, "root")
# 根节点下有 三个子节点
node1 = Node(root, "node1")
node2 = Node(root, "node2")
node3 = Node(root, "node3")
# node1 下有2个节点 node11 和 node12
node11 = Node(node1, "node11")
node12 = Node(node1, "node12")
# node2 下有3个节点 node21 node22 和 node23
node21 = Node(node2, "node21")
node22 = Node(node2, "node22")
node23 = Node(node2, "node23")
# node23 下有1个节点 node231
node231 = Node(node23, "node231")
# node231 下有2个节点 node2311 node2312
node2311 = Node(node231, "node2311")
node2312 = Node(node231, "node2312")
## ...... 

模拟数据库

node_list = [root, node1, node2, node3, node11, node12, node21, node22, node23, node231, node2311, node2312]

构建 tree

def build_tree(nodes, parent):
    """
    从某个节点开始构建其树列表的 dict 结构
    :param nodes:  被查询的节点列表 可理解为整个树结构中所有的节点列表
    :param parent:  当前节点的父节点
    :return:
    """
    # 创建 node_list 用来记录该节点下的所有(直接和间接)节点列表
    # 在不存在 merge 的情况下,删除该节点时,该列表中的节点应该被全部删除
    node_list = list()

    # create empty tree to fill
    tree = dict()

    # 递归构建
    build_tree_recursive(tree, parent, nodes, node_list)

    return tree, node_list


def build_tree_recursive(tree, parent, nodes, node_list):
    """
    递归构建的过程
    :param tree:
    :param parent: 递归过程中当前的父节点
    :param nodes:
    :param node_list: 该节点下的所有直接和间接列表
    :return:
    """
    # find children
    children = [n for n in nodes if n.parent == parent]

    node_list.extend([c.name for c in children])

    # build a subtree for each child
    for child in children:
        # start new subtree
        tree[child.name] = {}

        # call recursively to build a subtree for current node
        build_tree_recursive(tree[child.name], child, nodes, node_list)

测试

 if __name__ == "__main__":
    # just test it
    res1, res2 = build_tree(node_list, None)
    print(res1)
    print()
    print()
    print(res2)

运行结果

在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值