python实现菜单树算法

这段内容描述了一个名为`MenuTree`的类,用于处理和转换以列表形式表示的菜单树数据。类中包含方法`from_list`和`from_parent_list`,分别将数据转换为以主键为索引的树形结构,并根据父键关系建立子节点到父节点的链接。示例数据展示了如何使用这个类来构建一个简单的菜单树。
摘要由CSDN通过智能技术生成

定义菜单树类结构

from functools import reduce


class MenuTree():
    def __init__(self, tree, primary_key='id', parent_key='parent_id', label='children', parent_label='parent'):
        self.tree = tree
        self.primary_key = primary_key
        self.parent_key = parent_key
        self.label = label
        self.parent_label = parent_label

    def __to_tree_dict(self):
        def allocate_node(cur_node, new_node):
            cur_node[new_node.get(self.primary_key)] = new_node
            return cur_node

        # key为主键,方便直接索引获取
        info = reduce(allocate_node, self.tree, {})
        return info

    def __to_parent_tree_dict(self):
        def allocate_node(cur_node, new_node):
            cur_node[new_node.get(self.primary_key)] = new_node
            new_node[self.parent_label] = []
            return cur_node

        # key为主键,方便直接索引获取
        info = reduce(allocate_node, self.tree, {})
        return info

    def from_list(self):
        def __tree_filter(node):
            if node.get(self.parent_key) and info.get(node.get(self.parent_key)):
                children = info[node.get(self.parent_key)].get(self.label, [])
                children.append(node)
                # 在父节点下添加孩子
                info[node.get(self.parent_key)].update({
                    self.label: children
                })
            # 过滤掉孩子节点
            return not node.get(self.parent_key)

        info = self.__to_tree_dict()
        self.tree = list(filter(lambda x: __tree_filter(x), self.tree))

    def from_parent_list(self):
        def __tree_filter(node):
            if node.get(self.parent_key) and info.get(node.get(self.parent_key)):
                # 在子节点下添加父节点
                node.get(self.parent_label).append(info[node.get(self.parent_key)])
            return True

        info = self.__to_parent_tree_dict()
        self.tree = list(filter(lambda x: __tree_filter(x), self.tree))

生成树结构

menus=[
	{
		"id":1,
		"parent_id":None
	},
	{
		"id":2,
		"parent_id":1
	}
]
menu_tree = MenuTree(menus)
menu_tree.from_list()
print(menu_tree.tree)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值