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的Bottle框架中获取制定cookie的教程
Apr 24 Python
Python开发之快速搭建自动回复微信公众号功能
Apr 22 Python
Django卸载之后重新安装的方法
Mar 15 Python
Python高级特性切片(Slice)操作详解
Sep 27 Python
Python 从一个文件中调用另一个文件的类方法
Jan 10 Python
Python去除字符串前后空格的几种方法
Mar 04 Python
检测python爬虫时是否代理ip伪装成功的方法
Jul 12 Python
python opencv如何实现图片绘制
Jan 19 Python
如何更换python默认编辑器的背景色
Aug 10 Python
Python Socket多线程并发原理及实现
Dec 11 Python
用60行代码实现Python自动抢微信红包
Feb 04 Python
Python制作动态字符画的源码
Aug 04 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
Js放到HTML文件中的哪个位置有什么区别
2013/08/21 Javascript
javascript使用location.search的示例
2013/11/05 Javascript
jquery实现可拖动DIV自定义保存到数据的实例
2013/11/20 Javascript
jquery实现带渐变淡入淡出并向右依次展开的多级菜单效果实例
2015/08/22 Javascript
超级简易的JS计算器实例讲解(实现加减乘除)
2017/08/08 Javascript
简单谈谈关于Angular Cli打包的事
2017/09/05 Javascript
vue中的计算属性的使用和vue实例的方法示例
2017/12/04 Javascript
JavaScript实现一个带AI的井字棋游戏源码
2018/05/21 Javascript
layui原生表单验证的实例
2019/09/09 Javascript
JavaScript中arguments的使用方法详解
2020/12/20 Javascript
python使用append合并两个数组的方法
2015/04/28 Python
浅析Python中将单词首字母大写的capitalize()方法
2015/05/18 Python
Python实现扩展内置类型的方法分析
2017/10/16 Python
python hbase读取数据发送kafka的方法
2018/12/27 Python
python调用百度地图WEB服务API获取地点对应坐标值
2019/01/16 Python
python移位运算的实现
2019/07/15 Python
python 设置xlabel,ylabel 坐标轴字体大小,字体类型
2019/07/23 Python
python3 requests库文件上传与下载实现详解
2019/08/22 Python
python 命令行传入参数实现解析
2019/08/30 Python
Django Form and ModelForm的区别与使用
2019/12/06 Python
Python3爬虫RedisDump的安装步骤
2021/02/20 Python
英国足球店:UK Soccer Shop
2017/11/19 全球购物
将n个数按输入顺序的逆序排列,用函数实现
2012/11/14 面试题
大学生入党自我鉴定
2013/10/31 职场文书
优秀员工个人的自我评价
2013/11/29 职场文书
应届毕业生个人自荐信范文
2013/11/30 职场文书
上班玩手机检讨书
2014/02/17 职场文书
人民教师的自我评价分享
2014/02/21 职场文书
幼儿园保育员岗位职责
2014/04/13 职场文书
白酒营销策划方案
2014/08/17 职场文书
党员活动总结
2015/02/04 职场文书
三八节活动简报
2015/07/20 职场文书
中小学教师继续教育心得体会
2016/01/19 职场文书
七年级作文之游记
2019/12/11 职场文书
Apache压力测试工具的安装使用
2021/03/31 Servers
解决go在函数退出后子协程的退出问题
2021/04/30 Golang