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


Posted in Python onJanuary 21, 2021

后端研发的同学对无限级分类肯定映像深刻,当初花了不少时间吧?

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

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,即家用电器属于电器类产品。电吹风条目跟电器条目并无直接的标识进行关联,但需要用树状结构来表明 电器 <- 家用电器 <- 电吹风 的关系。

通过 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

至此,无限级分类树状结构生成算法完成。你学会了吗?

到此这篇关于Python 无限级分类树状结构生成算法的实现的文章就介绍到这了,更多相关Python 无限级分类树状结构内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
详解Python中的相对导入和绝对导入
Jan 06 Python
python操作mysql数据库
Mar 05 Python
Python简单实现阿拉伯数字和罗马数字的互相转换功能示例
Apr 17 Python
Python爬虫框架scrapy实现的文件下载功能示例
Aug 04 Python
在Pycharm中项目解释器与环境变量的设置方法
Oct 29 Python
CentOS 7下安装Python3.6 及遇到的问题小结
Nov 08 Python
详解使用python绘制混淆矩阵(confusion_matrix)
Jul 14 Python
Python实现的爬取豆瓣电影信息功能案例
Sep 15 Python
python基于三阶贝塞尔曲线的数据平滑算法
Dec 27 Python
pytorch实现mnist分类的示例讲解
Jan 10 Python
如何解决pycharm调试报错的问题
Aug 06 Python
python使用openpyxl库读写Excel表格的方法(增删改查操作)
May 02 Python
python 制作网站筛选工具(附源码)
Jan 21 #Python
python使用scapy模块实现ping扫描的过程详解
Jan 21 #Python
Python 中如何使用 virtualenv 管理虚拟环境
Jan 21 #Python
python使用scapy模块实现ARP扫描的过程
Jan 21 #Python
Python3利用scapy局域网实现自动多线程arp扫描功能
Jan 21 #Python
Pandas直接读取sql脚本的方法
Jan 21 #Python
python asyncio 协程库的使用
Jan 21 #Python
You might like
php 多个submit提交表单 处理方法
2009/07/07 PHP
php正则替换处理HTML页面的方法
2015/06/17 PHP
PHP Web木马扫描器代码分享
2015/09/06 PHP
Thinkphp 框架扩展之Widget扩展实现方法分析
2020/04/23 PHP
PHP加MySQL消息队列深入理解
2021/02/27 PHP
Jquery作者John Resig自己封装的javascript 常用函数
2009/11/09 Javascript
ModelDialog JavaScript模态对话框类代码
2011/04/17 Javascript
通过onmouseover选项卡实现img图片的变化
2014/02/12 Javascript
Jquery validation remote 验证的缓存问题解决方法
2014/03/25 Javascript
可编辑下拉框的2种实现方式
2014/06/13 Javascript
javascript实时显示北京时间的方法
2015/03/12 Javascript
jQuery实现自动调整字体大小的方法
2015/06/15 Javascript
jQuery+CSS实现的网页二级下滑菜单效果
2015/08/25 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(一)
2017/01/21 Javascript
vue动态生成dom并且自动绑定事件
2017/04/19 Javascript
利用Jasmine对Angular进行单元测试的方法详解
2017/06/12 Javascript
jQuery+C#实现参数RSA加密传输功能【附jsencrypt.js下载】
2017/06/26 jQuery
Node.js 回调函数实例详解
2017/07/06 Javascript
JS+CSS实现网页加载中的动画效果
2017/10/27 Javascript
基于vue 添加axios组件,解决post传参数为null的问题
2018/03/05 Javascript
使用vue开发移动端管理后台的注意事项
2019/03/07 Javascript
vue实现动态给id赋值,点击事件获取当前点击的元素的id操作
2020/11/09 Javascript
[02:38]DOTA2亚洲邀请赛 IG战队巡礼
2015/02/03 DOTA
Python实现动态加载模块、类、函数的方法分析
2017/07/18 Python
numpy自动生成数组详解
2017/12/15 Python
python自动化生成IOS的图标
2018/11/13 Python
python安装第三方库如xlrd的方法
2020/10/31 Python
HTML5 CSS3打造相册效果附源码下载
2014/06/16 HTML / CSS
Sephora丝芙兰澳洲官方网站:国际知名化妆品购物
2016/10/27 全球购物
.NET初级开发工程师面试题(包括Javascript)
2012/08/22 面试题
教师简历自我评价
2014/02/03 职场文书
护校行动方案
2014/05/31 职场文书
成品仓库管理员岗位职责
2015/04/09 职场文书
2015年实习生工作总结报告
2015/04/28 职场文书
2016元旦主持人经典开场白台词
2015/12/03 职场文书
Redis高并发缓存架构性能优化
2022/05/15 Redis