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抓取电影天堂电影信息的代码
Apr 07 Python
django使用html模板减少代码代码解析
Dec 12 Python
python+matplotlib绘制简单的海豚(顶点和节点的操作)
Jan 02 Python
Python中偏函数用法示例
Jun 07 Python
Python基于最小二乘法实现曲线拟合示例
Jun 14 Python
Python-Seaborn热图绘制的实现方法
Jul 15 Python
python实现XML解析的方法解析
Nov 16 Python
使用pyinstaller逆向.pyc文件
Dec 20 Python
python实现在一个画布上画多个子图
Jan 19 Python
Python自动采集微信联系人的实现示例
Feb 28 Python
学习Python列表的基础知识汇总
Mar 10 Python
在django项目中导出数据到excel文件并实现下载的功能
Mar 13 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自动适应范围的分页代码
2008/08/05 PHP
PHP中运用jQuery的Ajax跨域调用实现代码
2012/02/21 PHP
php Calender(日历)代码分享
2014/01/03 PHP
PHP定时任务延缓执行的实现
2014/10/08 PHP
PHP经典面试题之设计模式(经常遇到)
2015/10/15 PHP
javascript 日历提醒系统( 兼容所有浏览器 )
2009/04/07 Javascript
编写兼容IE和FireFox的脚本
2009/05/18 Javascript
一个网马的tips实现分析
2010/11/28 Javascript
javascript的原生方法获取数组中的最大(最小)值
2012/12/19 Javascript
JavaScript判断字符长度、数字、Email、电话等常用判断函数分享
2015/04/01 Javascript
JS 对象(Object)和字符串(String)互转方法
2016/05/20 Javascript
Bootstrap框架结合jQuery仿百度换肤功能实例解析
2016/09/17 Javascript
jquery实现转盘抽奖功能
2017/01/06 Javascript
JS实现的DIV块来回滚动效果示例
2017/02/07 Javascript
原生javascript实现读写CSS样式的方法详解
2017/02/20 Javascript
Vue + Webpack + Vue-loader学习教程之相关配置篇
2017/03/14 Javascript
vue.js国际化 vue-i18n插件的使用详解
2017/07/07 Javascript
使用JavaScript实现链表的数据结构的代码
2017/08/02 Javascript
js实现登录拖拽窗口
2020/02/10 Javascript
探索浏览器页面关闭window.close()的使用详解
2020/08/21 Javascript
Python命名空间的本质和加载顺序
2018/12/17 Python
python实现切割url得到域名、协议、主机名等各个字段的例子
2019/07/25 Python
python导入不同目录下的自定义模块过程解析
2019/11/18 Python
python双向链表原理与实现方法详解
2019/12/03 Python
python 插入日期数据到Oracle实例
2020/03/02 Python
皮姆斯勒语言学习:Pimsleur Language Programs
2018/06/30 全球购物
sealed修饰符是干什么的
2012/10/23 面试题
仪器仪表检测毕业生自荐信
2013/10/31 职场文书
入党积极分子思想汇报
2014/01/02 职场文书
高中打架检讨书
2014/02/13 职场文书
表决心的诗句大全
2014/03/11 职场文书
公司管理建议书范文
2014/03/12 职场文书
后天观后感
2015/06/08 职场文书
如何使用Maxwell实时同步mysql数据
2021/04/08 MySQL
浅谈Redis在直播场景的实践方案
2021/04/27 Redis
你知道哪几种MYSQL的连接查询
2021/06/03 MySQL