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 相关文章推荐
17个Python小技巧分享
Jan 23 Python
通过Python来使用七牛云存储的方法详解
Aug 07 Python
Python 模块EasyGui详细介绍
Feb 19 Python
Python实现的计数排序算法示例
Nov 29 Python
在Python dataframe中出生日期转化为年龄的实现方法
Oct 20 Python
python进行TCP端口扫描的实现
Dec 21 Python
浅谈Python小波分析库Pywavelets的一点使用心得
Jul 09 Python
python 抓包保存为pcap文件并解析的实例
Jul 23 Python
Python实现检测文件的MD5值来查找重复文件案例
Mar 12 Python
Python实现简单的猜单词小游戏
Oct 28 Python
Django项目在pycharm新建的步骤方法
Mar 02 Python
基于tensorflow权重文件的解读
May 26 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
通过JavaScript或PHP检测Android设备的代码
2011/03/09 PHP
php生成N个不重复的随机数实例
2013/11/12 PHP
Linux中为php配置伪静态
2014/12/17 PHP
PHP文件读取功能的应用实例
2015/05/08 PHP
php中isset与empty函数的困惑与用法分析
2019/07/05 PHP
可插入图片的TEXT文本框
2013/12/27 Javascript
javascript生成随机大小写字母的方法
2014/02/20 Javascript
javascript实现修改微信分享的标题内容等
2014/12/11 Javascript
5个数组Array方法: indexOf、filter、forEach、map、reduce使用实例
2015/01/29 Javascript
JS数字抽奖游戏实现方法
2015/05/04 Javascript
使用CamanJS在Web页面上处理图像的技巧
2015/08/18 Javascript
值得分享的JavaScript实现图片轮播组件
2016/11/21 Javascript
JS闭包的几种常见形式实例详解
2017/09/16 Javascript
vue中post请求以a=a&amp;b=b 的格式写遇到的问题
2018/04/27 Javascript
Vue2.x Todo之自定义指令实现自动聚焦的方法
2019/01/08 Javascript
js实现二级联动简单实例
2020/01/11 Javascript
python通过定义一个类实例作为ftp回调方法
2015/05/04 Python
flask中使用蓝图将路由分开写在不同文件实例解析
2018/01/19 Python
Python装饰器知识点补充
2018/05/28 Python
python文件拆分与重组实例
2018/12/10 Python
在Django中实现添加user到group并查看
2019/11/18 Python
python3 图片 4通道转成3通道 1通道转成3通道 图片压缩实例
2019/12/03 Python
Python高并发解决方案实现过程详解
2020/07/31 Python
使用jupyter notebook运行python和R的步骤
2020/08/13 Python
python 6行代码制作月历生成器
2020/09/18 Python
Python爬虫开发与项目实战
2020/12/16 Python
个人实用简单的自我评价
2013/10/19 职场文书
党支部公开承诺书
2014/03/28 职场文书
负责人任命书范本
2014/06/04 职场文书
2014矛盾纠纷排查调处工作总结
2014/12/09 职场文书
教师业务学习材料
2014/12/16 职场文书
模范教师事迹材料
2014/12/16 职场文书
采购员岗位职责
2015/02/03 职场文书
司机个人年终总结
2015/03/03 职场文书
药品开票员岗位职责
2015/04/15 职场文书
Javascript中的解构赋值语法详解
2021/04/02 Javascript