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 23 Python
python itchat实现微信自动回复的示例代码
Aug 14 Python
Python pyinotify日志监控系统处理日志的方法
Mar 08 Python
python 将md5转为16字节的方法
May 29 Python
python 多线程中子线程和主线程相互通信方法
Nov 09 Python
python time.sleep()是睡眠线程还是进程
Jul 09 Python
python程序 创建多线程过程详解
Sep 23 Python
pycharm通过ssh连接远程服务器教程
Feb 12 Python
Python基于Socket实现简单聊天室
Feb 17 Python
Python Web项目Cherrypy使用方法镜像
Nov 05 Python
python调用百度AI接口实现人流量统计
Feb 03 Python
Python干货实战之八音符酱小游戏全过程详解
Oct 24 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绝对路径与相对路径之间关系的的分析
2010/03/03 PHP
php opendir()列出目录下所有文件的实例代码
2016/10/02 PHP
PHP实现的DES加密解密封装类完整实例
2017/04/29 PHP
PHP延迟静态绑定使用方法实例解析
2020/09/05 PHP
javascript利用初始化数据装配模版的实现代码
2010/11/17 Javascript
jquery eval解析JSON中的注意点介绍
2013/08/23 Javascript
基于jQuery实现的图片切换焦点图整理
2014/12/07 Javascript
javascript中数组方法汇总
2015/07/07 Javascript
JavaScript中的Function函数
2015/08/27 Javascript
Nodejs实战心得之eventproxy模块控制并发
2015/10/27 NodeJs
原生js实现网易轮播图效果
2020/04/10 Javascript
canvas实现探照灯效果
2017/02/07 Javascript
JavaScript数据结构之二叉查找树的定义与表示方法
2017/04/12 Javascript
Angular中实现树形结构视图实例代码
2017/05/05 Javascript
vue.js实现刷新当前页面的方法教程
2017/07/05 Javascript
微信小程序实现顶部导航特效
2019/01/28 Javascript
Vue实现返回顶部按钮实例代码
2020/10/21 Javascript
[00:28]DOTA2北京网鱼队选拔赛
2015/04/08 DOTA
[06:07]DOTA2-DPC中国联赛 正赛 Ehome vs VG 选手采访
2021/03/11 DOTA
python自动化测试之setUp与tearDown实例
2014/09/28 Python
python3.6使用pymysql连接Mysql数据库
2018/05/25 Python
使用Python控制摄像头拍照并发邮件
2019/04/23 Python
python中通过pip安装库文件时出现“EnvironmentError: [WinError 5] 拒绝访问”的问题及解决方案
2020/08/11 Python
详解torch.Tensor的4种乘法
2020/09/03 Python
CSS3+HTML5+JS 实现一个块的收缩与展开动画效果
2020/11/17 HTML / CSS
伦敦最有品味的百货:Liberty London
2016/11/12 全球购物
欧舒丹比利时官网:L’OCCITANE比利时
2017/04/25 全球购物
酒店led欢迎词
2014/01/09 职场文书
2014年党建工作汇报材料
2014/10/27 职场文书
求职信范文怎么写
2015/03/19 职场文书
责任书范本大全
2015/05/11 职场文书
2015年行政人事工作总结
2015/05/21 职场文书
民事纠纷协议书
2016/03/23 职场文书
演讲稿:​快乐,从不抱怨开始!
2019/04/02 职场文书
Vue.js中v-bind指令的用法介绍
2022/03/13 Vue.js
js作用域及作用域链工作引擎
2022/07/07 Javascript