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中input与raw_input 之间的比较
Aug 20 Python
Python自然语言处理之词干,词形与最大匹配算法代码详解
Nov 16 Python
Python编程求解二叉树中和为某一值的路径代码示例
Jan 04 Python
Python获取当前函数名称方法实例分享
Jan 18 Python
Python设计模式之适配器模式原理与用法详解
Jan 15 Python
OpenCV搞定腾讯滑块验证码的实现代码
May 18 Python
基于Python的微信机器人开发 微信登录和获取好友列表实现解析
Aug 21 Python
Python调用graphviz绘制结构化图形网络示例
Nov 22 Python
TensorFlow 读取CSV数据的实例
Feb 05 Python
python获取栅格点和面值的实现
Mar 10 Python
python能开发游戏吗
Jun 11 Python
Python实现PIL图像处理库绘制国际象棋棋盘
Jul 16 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循环获取GET和POST值的代码
2008/04/09 PHP
PHP+SQL 注入攻击的技术实现以及预防办法
2010/12/29 PHP
PHP中的替代语法简介
2014/08/22 PHP
ThinkPHP 表单自动验证运用示例
2014/10/13 PHP
PHP中的多种加密技术及代码示例解析
2016/10/20 PHP
php字符串过滤strip_tags()函数用法实例分析
2019/06/24 PHP
PHP 多进程与信号中断实现多任务常驻内存管理实例方法
2019/10/04 PHP
发两个小东西,ASP/PHP 学习工具。 用JavaScript写的
2007/04/12 Javascript
asp.net下利用js实现返回上一页的实现方法小集
2009/11/24 Javascript
javascript 精粹笔记
2010/05/09 Javascript
基于JQuery和CSS3实现仿Apple TV海报背景视觉差特效源码分享
2015/09/21 Javascript
浅谈js中同名函数和同名变量的执行问题
2017/02/12 Javascript
借助node实战JSONP跨域实例
2017/03/30 Javascript
AngularJS常见过滤器用法实例总结
2017/07/06 Javascript
JavaScript Canvas实现验证码
2020/08/02 Javascript
微信小程序开发之点击按钮退出小程序的实现方法
2019/04/26 Javascript
layui复选框的全选与取消实现方法
2019/09/02 Javascript
浅谈layui使用模板引擎动态渲染元素要注意的问题
2019/09/14 Javascript
[01:03:13]VG vs Pain 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python 连连看连接算法
2008/11/22 Python
python修改操作系统时间的方法
2015/05/18 Python
一个基于flask的web应用诞生 组织结构调整(7)
2017/04/11 Python
python2.7实现FTP文件下载功能
2018/04/15 Python
python 反向输出字符串的方法
2018/07/16 Python
Python数据可视化库seaborn的使用总结
2019/01/15 Python
pandas 如何分割字符的实现方法
2019/07/29 Python
浅谈Python中的异常和JSON读写数据的实现
2020/02/27 Python
Python matplotlib修改默认字体的操作
2020/03/05 Python
Python configparser模块应用过程解析
2020/08/14 Python
python基本算法之实现归并排序(Merge sort)
2020/09/01 Python
linux面试题参考答案(9)
2016/01/29 面试题
小学生演讲稿大全
2014/04/25 职场文书
毕业生的自我鉴定表范文
2019/05/16 职场文书
pytorch 如何使用amp进行混合精度训练
2021/05/24 Python
浅谈redis整数集为什么不能降级
2021/07/25 Redis
Spring Boot项目如何优雅实现Excel导入与导出功能
2022/06/10 Java/Android