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实现命令行版的火车票查看器
Aug 05 Python
python中关于for循环的碎碎念
Jun 30 Python
linux环境下的python安装过程图解(含setuptools)
Nov 22 Python
使用python读取csv文件快速插入数据库的实例
Jun 21 Python
详解python实现交叉验证法与留出法
Jul 11 Python
使用python 计算百分位数实现数据分箱代码
Mar 03 Python
Python编写单元测试代码实例
Sep 10 Python
Python 列表推导式需要注意的地方
Oct 23 Python
全网最全python库selenium自动化使用详细教程
Jan 12 Python
Python 制作自动化翻译工具
Apr 25 Python
七个非常实用的Python工具包总结
Jun 15 Python
浅谈Python数学建模之固定费用问题
Jun 23 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函数间的参数传递(值传递/引用传递)
2013/09/23 PHP
php引用传值实例详解学习
2013/11/06 PHP
PHP管理依赖(dependency)关系工具 Composer的自动加载(autoload)
2014/08/18 PHP
如何用PHP来实现一个动态Web服务器
2015/07/29 PHP
PHP实现的oracle分页函数实例
2016/01/25 PHP
IE7提供XMLHttpRequest对象为兼容
2007/03/08 Javascript
一个加载js文件的小脚本
2007/06/28 Javascript
JS 无法通过W3C验证的处理方法
2010/03/09 Javascript
jQuery的选择器中的通配符使用介绍
2014/03/20 Javascript
jQuery插件ajaxFileUpload使用实例解析
2016/10/19 Javascript
浅谈jquery采用attr修改form表单enctype不起作用的问题
2016/11/25 Javascript
解决ajax不能访问本地文件问题(利用js跨域原理)
2017/01/24 Javascript
JavaScript DOM元素常见操作详解【添加、删除、修改等】
2018/05/09 Javascript
JS调用安卓手机摄像头扫描二维码
2018/10/16 Javascript
「中高级前端面试」JavaScript手写代码无敌秘籍(推荐)
2019/04/08 Javascript
微信小程序wx.request的简单封装
2019/11/13 Javascript
[38:32]DOTA2上海特级锦标赛A组资格赛#2 Secret VS EHOME第二局
2016/02/26 DOTA
基于python时间处理方法(详解)
2017/08/14 Python
python实现随机梯度下降法
2020/03/24 Python
对web.py设置favicon.ico的方法详解
2018/12/04 Python
python处理multipart/form-data的请求方法
2018/12/26 Python
Python turtle库绘制菱形的3种方式小结
2019/11/23 Python
pytorch 彩色图像转灰度图像实例
2020/01/13 Python
python ETL工具 pyetl
2020/06/07 Python
移动端Web页面的CSS3 flex布局快速上手指南
2016/05/31 HTML / CSS
CSS3解析抖音LOGO制作的方法步骤
2019/04/11 HTML / CSS
Omio西班牙:全欧洲低价大巴、火车和航班搜索和比价
2017/02/11 全球购物
HUGO BOSS美国官方网上商店:世界知名奢侈品牌
2017/08/04 全球购物
简述数组与指针的区别
2014/01/02 面试题
校领导推荐信
2013/11/01 职场文书
会计电算化专业毕业生推荐信
2013/12/24 职场文书
经贸日语专业个人求职信范文
2013/12/28 职场文书
八一建军节感言
2014/02/28 职场文书
2015七夕情人节宣传语
2015/07/14 职场文书
2016年度先进班组事迹材料
2016/03/01 职场文书
Nginx配置文件详解以及优化建议指南
2021/09/15 Servers