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用GET方法上传文件
Mar 10 Python
python numpy函数中的linspace创建等差数列详解
Oct 13 Python
Python爬虫天气预报实例详解(小白入门)
Jan 24 Python
python如何为创建大量实例节省内存
Mar 20 Python
PyTorch线性回归和逻辑回归实战示例
May 22 Python
符合语言习惯的 Python 优雅编程技巧【推荐】
Sep 25 Python
windows7 32、64位下python爬虫框架scrapy环境的搭建方法
Nov 29 Python
Python在Matplotlib图中显示中文字体的操作方法
Jul 29 Python
Python Collatz序列实现过程解析
Oct 12 Python
Python warning警告出现的原因及忽略方法
Jan 31 Python
matplotlib更改窗口图标的方法示例
Feb 03 Python
pytorch __init__、forward与__call__的用法小结
Feb 27 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面试题附答案
2009/01/07 PHP
php关于array_multisort多维数组排序的使用说明
2011/01/04 PHP
PHP数据流应用的一个简单实例
2012/09/14 PHP
利用php实现一周之内自动登录存储机制(cookie、session、localStorage)
2016/10/31 PHP
基于Codeigniter框架实现的student信息系统站点动态发布功能详解
2017/03/23 PHP
去除链接虚线全面分析总结
2006/08/15 Javascript
jquery之empty()与remove()区别说明
2010/09/10 Javascript
Javascript 倒计时源代码.(时.分.秒) 详细注释版
2011/05/09 Javascript
actionscript与javascript的区别
2011/05/25 Javascript
JavaScript中的作用域链和闭包
2012/06/30 Javascript
跨域传值即主页面与iframe之间互相传值
2013/12/09 Javascript
关于Javascript 对象(object)的prototype
2014/05/09 Javascript
Jquery全屏相册插件zoomvisualizer具有调节放大与缩小功能
2015/11/02 Javascript
jquery.validate表单验证插件使用方法解析
2016/11/07 Javascript
Vue 2.0学习笔记之使用$refs访问Vue中的DOM
2017/12/19 Javascript
Canvas实现微信红包照片效果
2018/08/21 Javascript
JavaScript解析机制与闭包原理实例详解
2019/03/08 Javascript
浅谈bootstrap layer.open中end的使用方法
2019/09/12 Javascript
CentOS中升级Python版本的方法详解
2017/07/10 Python
快速解决PyCharm无法引用matplotlib的问题
2018/05/24 Python
python删除文件夹下相同文件和无法打开的图片
2019/07/16 Python
python 类的继承 实例方法.静态方法.类方法的代码解析
2019/08/23 Python
python实现树的深度优先遍历与广度优先遍历详解
2019/10/26 Python
在pycharm中为项目导入anacodna环境的操作方法
2020/02/12 Python
python脚本第一行如何写
2020/08/30 Python
html5 利用canvas实现超级玛丽简单动画
2013/09/06 HTML / CSS
谷歌浏览器小字体处理方案即12px以下字体
2013/12/17 HTML / CSS
HTML5利用约束验证API来检查表单的输入数据的代码实例
2016/12/20 HTML / CSS
英语翻译系毕业生求职信
2013/09/29 职场文书
财务会计专业毕业生自荐信
2013/10/02 职场文书
婚前财产公证书
2014/04/10 职场文书
关于环保的标语
2014/06/13 职场文书
旷课检讨书范文
2015/01/27 职场文书
2016年国庆节新闻稿范文
2015/11/25 职场文书
Redis集群新增、删除节点以及动态增加内存的方法
2021/09/04 Redis
微信小程序中wxs文件的一些妙用分享
2022/02/18 Javascript