当前位置: 首页 > 后端技术 > Python

Python实战代码——无限级分类树结构生成算法

时间:2023-03-26 18:23:11 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},]字段父记录为该条目的父编号,例如吹风机的父编号为3,即吹风机属于家电,家电的父编号为1,即,家用电器属于电器产品。电吹风项和电器项之间没有直接标识,需要用树形结构来表示电器<-家用电器<-电吹风的关系。Copyright水印微信公众号Python编程参考通过parent找到父数并建立关系的操作其实就是一个循环,直到找到所有的节点。这个很符合递归算法,很容易写出相应的递归代码:defgenerate_tree(source,parent):tree=[]foriteminsource:ifitem["parent"]==parent:item["child"]=generate_tree(source,item["id"])tree.append(item)returntree只需要将存储在数据库中的信息传递给generate_tree函数即可。这段递归代码在来回循环的过程中使用parent寻找子节点,找到子节点后添加到树中。完整代码如下:importjsondefgenerate_tree(source,parent):tree=[]foriteminsource:ifitem["parent"]==parent:item["child"]=generate_tree(source,item["id"])tree.append(item)returntreeif__name__=='__main__':permission_source=[{"id":1,"name":'Appliance',"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))尝试运行一下,看看结构是否符合预期。使用缓存优化算法的递归算法中有很多重复计算。这些计算不仅会占用额外的资源,还会降低函数执行的效率。因此,需要优化递归。这里采用缓存优化的方法来提高函数的执行效率。基本思路是,每找到一个节点关系,就把这个表项的编号加到一个链表中缓存起来,也就是说这个表项找到了一个节点关系。当功能以往复循环执行时,可以跳过此条目。代码修改很简单,只需要添加缓存列表和控制流语句:defgenerate_tree(source,parent,cache=[]):tree=[]foriteminsource:ifitem["id"]incache:continue如果item["parent"]==parent:cache.append(item["id"])item["child"]=generate_tree(source,item["id"],cache)tree.append(item)返回树至此,无限类分类树结构生成算法完成。你学会了吗?这里是微信公众号Python编程参考,如果您觉得本文对您有帮助,请关注我。点击进入作者专栏https://www.weishidong.com查看更多有用知识。