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查询mysql中文乱码问题
Nov 09 Python
Python打印scrapy蜘蛛抓取树结构的方法
Apr 08 Python
Python命令行参数解析模块getopt使用实例
Apr 13 Python
python实现文本文件合并
Dec 29 Python
python基于http下载视频或音频
Jun 20 Python
python3.6根据m3u8下载mp4视频
Jun 17 Python
Python发送邮件的实例代码讲解
Oct 16 Python
python处理RSTP视频流过程解析
Jan 11 Python
pycharm 2018 激活码及破解补丁激活方式
Sep 21 Python
Python基于wordcloud及jieba实现中国地图词云图
Jun 09 Python
Python图像阈值化处理及算法比对实例解析
Jun 19 Python
python ssh 执行shell命令的示例
Sep 29 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
一些花式咖啡的配方
2021/03/03 冲泡冲煮
PHP邮件专题
2006/10/09 PHP
使用 php4 加速 web 传输
2006/10/09 PHP
探讨Smarty中如何获取数组的长度以及smarty调用php函数的详解
2013/06/20 PHP
一致性哈希算法以及其PHP实现详细解析
2013/08/24 PHP
php查找任何页面上的所有链接的方法
2013/12/03 PHP
使用php测试硬盘写入速度示例
2014/01/27 PHP
php递归创建目录的方法
2015/02/02 PHP
php array_key_exists() 与 isset() 的区别
2016/10/24 PHP
php从身份证获取性别和出生年月
2017/02/09 PHP
PHP大文件切割上传功能实例分析
2019/07/01 PHP
用dom+xhtml+css制作的一个相册效果代码打包下载
2008/01/24 Javascript
js取消单选按钮选中示例代码
2013/11/14 Javascript
js使用数组判断提交数据是否存在相同数据
2013/11/27 Javascript
javascript中style.left和offsetLeft的用法说明
2014/03/07 Javascript
jquery和js实现对div的隐藏和显示方法
2014/09/26 Javascript
Vue.js双向绑定实现原理详解
2016/12/22 Javascript
vue实现点击图片放大效果
2017/08/15 Javascript
vue实现在表格里,取每行的id的方法
2018/03/09 Javascript
vue路由传参页面刷新参数丢失问题解决方案
2019/10/08 Javascript
JavaScript实现简易计算器小功能
2020/10/22 Javascript
Pyhton中防止SQL注入的方法
2015/02/05 Python
用Python制作简单的钢琴程序的教程
2015/04/01 Python
[原创]pip和pygal的安装实例教程
2017/12/07 Python
python绘制热力图heatmap
2020/03/23 Python
python pandas读取csv后,获取列标签的方法
2018/11/12 Python
python写入数据到csv或xlsx文件的3种方法
2019/08/23 Python
如何在 Django 模板中输出 &quot;{{&quot;
2020/01/24 Python
Python装饰器用法与知识点小结
2020/03/09 Python
美国领先的医疗警报服务:Philips Lifeline
2018/03/12 全球购物
体育教育专业毕业生自荐信
2013/11/15 职场文书
汽车技术服务英文求职信范文
2014/01/02 职场文书
建材投资建议书
2014/05/16 职场文书
服务口号大全
2014/06/11 职场文书
80后创业总结的9条职场用人思想,记得收藏
2019/08/13 职场文书
Win10服务主机占用内存怎么办?Win10服务主机进程占用大量内存解决方法
2022/09/23 数码科技