千家信息网

Python如何实现无限级分类树状结构生成算法

发表于:2025-01-31 作者:千家信息网编辑
千家信息网最后更新 2025年01月31日,本篇文章给大家分享的是有关Python如何实现无限级分类树状结构生成算法,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。无限级分类树状结构
千家信息网最后更新 2025年01月31日Python如何实现无限级分类树状结构生成算法

本篇文章给大家分享的是有关Python如何实现无限级分类树状结构生成算法,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

无限级分类树状结构的应用场景很多,例如后端研发需要把用户相关权限读取出来并生成树状结构,前端研发拿到权限树之后可以按照结构展示用户有权限访问的栏目;再例如网页上的栏目分级:

作者在初次接触树状结构生成需求的时候,也是挠头,后来找到了一个代码少且清晰易懂的生成算法:递归。

首先,确保数据库中存储的类别信息如下:

[  {"id": 1, "name": '电器', "parent": 0},  {"id": 2, "name": '水果', "parent": 0},  {"id": 3, "name": '家用电器', "parent": 1},  {"id": 4, "name": '电吹风', "parent": 3},  {"id": 5, "name": '电风扇', "parent": 3},  {"id": 6, "name": '台灯', "parent": 3},  {"id": 7, "name": '商用电器', "parent": 1},  {"id": 8, "name": '大型电热锅', "parent": 7}, ]

字段 parent 记录的是此条目的父编号,例如电吹风的父编号是 3,即电吹风属于家用电器,而家用电器的父编号是 1,即家用电器属于电器类产品。电吹风条目跟电器条目并无直接的标识进行关联,但需要用树状结构来表明 电器 <- 家用电器 <- 电吹风 的关系。

版权水印 微信公众号 Python 编程参考

通过 parent 寻找父编号,并建立关联关系的操作实际上是循环往复的,直到找完所有的结点,这跟递归算法非常契合,很轻松便能写出对应的递归代码:

def generate_tree(source, parent):  tree = []  for item in source:  if item["parent"] == parent:  item["child"] = generate_tree(source, item["id"])  tree.append(item)  return tree

只需要将数据库中存储的信息传递给 generate_tree 函数即可。这段递归代码在往复循环的过程中通过 parent 来寻找子结点,找到子结点后将其添加到树中。完整代码如下:

import json def generate_tree(source, parent):  tree = []  for item in source:  if item["parent"] == parent:  item["child"] = generate_tree(source, item["id"])  tree.append(item)  return tree if __name__ == '__main__':  permission_source = [  {"id": 1, "name": '电器', "parent": 0},  {"id": 2, "name": '水果', "parent": 0},  {"id": 3, "name": '家用电器', "parent": 1},  {"id": 4, "name": '电吹风', "parent": 2},  {"id": 5, "name": '电风扇', "parent": 3},  {"id": 6, "name": '台灯', "parent": 3},  {"id": 7, "name": '商用电器', "parent": 1},  {"id": 8, "name": '大型电热锅', "parent": 7},  ]  permission_tree = generate_tree(permission_source, 0)  print(json.dumps(permission_tree, ensure_ascii=False))

你试试运行一下,看看结构是否符合预期。

使用缓存优化算法

递归算法中有很多重复的计算,这些计算不仅占用额外资源,还会降低函数执行效率,因此需要对递归进行优化。这里选用缓存优化法提升函数执行效率。

基本思路是每次找到结点关系后将此条目的编号添加到一个列表中缓存起来,代表此条目已找到结点关系。当往复循环执行函数时再次遇到此条目可以跳过。代码改动很简单,增加一个缓存列表和控制流语句即可:

def generate_tree(source, parent, cache=[]):  tree = []  for item in source:  if item["id"] in cache:  continue  if item["parent"] == parent:  cache.append(item["id"])  item["child"] = generate_tree(source, item["id"], cache)  tree.append(item)  return tree

至此,无限级分类树状结构生成算法完成。


电器 结构 算法 家用电器 家用 电吹风 递归 生成 代码 结点 函数 条目 缓存 分类 权限 循环 信息 台灯 商用 效率 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 数据库写磁盘空间不足 奇安信认证网络安全吗 服务器 不执行 js 售后服务器哪个牌子好 苏州齐装网络技术 linux服务器代运维 豆瓣 星际公民服务器能有1000人吗 分析数据库如何安装 黑龙江库存管理软件开发 中标麒麟可以用数据库客户端 浪潮服务器带外上传镜像 零基础网络安全工程师培训 数据库业务流程图画法 浙江大数据数显钟服务器云空间 数据在数据库中是如何表示的 北京程序软件开发建设 我的世界寒假必玩生存服务器推荐 关于网络安全的演讲稿ppt模板 荒野的猎人怎么开服务器 哪种数据库最通用 网络技术基础定义分类组成及应用 铁路网络安全六个明确 善智互联网络科技有限公司 网络安全法按照事件 软件开发工具调查报告 sql如何导出数据库 网络安全工程师具备的技能 挂机赚钱软件开发 网络技术售前售后技术支持 hp服务器的管理口在哪里
0