成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python實用代碼-無限級分類樹狀結構生成算法

開發 前端 算法
無限級分類樹狀結構的應用場景很多,例如后端研發需要把用戶相關權限讀取出來并生成樹狀結構,前端研發拿到權限樹之后可以按照結構展示用戶有權限訪問的欄目

 后端研發的同學對無限級分類肯定映像深刻,當初花了不少時間吧?

無限級分類樹狀結構的應用場景很多,例如后端研發需要把用戶相關權限讀取出來并生成樹狀結構,前端研發拿到權限樹之后可以按照結構展示用戶有權限訪問的欄目;再例如網頁上的欄目分級:

作者在初次接觸樹狀結構生成需求的時候,也是撓頭,后來找到了一個代碼少且清晰易懂的生成算法:遞歸。

首先,確保數據庫中存儲的類別信息如下:

  1.  {"id"1"name"'電器'"parent"0}, 
  2.  {"id"2"name"'水果'"parent"0}, 
  3.  {"id"3"name"'家用電器'"parent"1}, 
  4.  {"id"4"name"'電吹風'"parent"3}, 
  5.  {"id"5"name"'電風扇'"parent"3}, 
  6.  {"id"6"name"'臺燈'"parent"3}, 
  7.  {"id"7"name"'商用電器'"parent"1}, 
  8.  {"id"8"name"'大型電熱鍋'"parent"7}, 

字段 parent 記錄的是此條目的父編號,例如電吹風的父編號是 3,即電吹風屬于家用電器,而家用電器的父編號是 1,即家用電器屬于電器類產品。電吹風條目跟電器條目并無直接的標識進行關聯,但需要用樹狀結構來表明 電器 <- 家用電器 <- 電吹風 的關系。

版權水印 微信公眾號 Python 編程參考

通過 parent 尋找父編號,并建立關聯關系的操作實際上是循環往復的,直到找完所有的結點,這跟遞歸算法非常契合,很輕松便能寫出對應的遞歸代碼:

  1. def generate_tree(source, parent): 
  2.  tree = [] 
  3.  for item in source: 
  4.  if item["parent"] == parent: 
  5.  item["child"] = generate_tree(source, item["id"]) 
  6.  tree.append(item) 
  7.  return tree 

只需要將數據庫中存儲的信息傳遞給 generate_tree 函數即可。這段遞歸代碼在往復循環的過程中通過 parent 來尋找子結點,找到子結點后將其添加到樹中。完整代碼如下:

  1. import json 
  2. def generate_tree(source, parent): 
  3.  tree = [] 
  4.  for item in source: 
  5.  if item["parent"] == parent: 
  6.  item["child"] = generate_tree(source, item["id"]) 
  7.  tree.append(item) 
  8.  return tree 
  9. if __name__ == '__main__'
  10.  permission_source = [ 
  11.  {"id"1"name"'電器'"parent"0}, 
  12.  {"id"2"name"'水果'"parent"0}, 
  13.  {"id"3"name"'家用電器'"parent"1}, 
  14.  {"id"4"name"'電吹風'"parent"2}, 
  15.  {"id"5"name"'電風扇'"parent"3}, 
  16.  {"id"6"name"'臺燈'"parent"3}, 
  17.  {"id"7"name"'商用電器'"parent"1}, 
  18.  {"id"8"name"'大型電熱鍋'"parent"7}, 
  19.  ] 
  20.  permission_tree = generate_tree(permission_source, 0
  21.  print(json.dumps(permission_tree, ensure_ascii=False)) 

你試試運行一下,看看結構是否符合預期。

使用緩存優化算法

遞歸算法中有很多重復的計算,這些計算不僅占用額外資源,還會降低函數執行效率,因此需要對遞歸進行優化。這里選用緩存優化法提升函數執行效率。

基本思路是每次找到結點關系后將此條目的編號添加到一個列表中緩存起來,代表此條目已找到結點關系。當往復循環執行函數時再次遇到此條目可以跳過。代碼改動很簡單,增加一個緩存列表和控制流語句即可:

  1. def generate_tree(source, parent, cache=[]): 
  2.  tree = [] 
  3.  for item in source: 
  4.  if item["id"] in cache: 
  5.  continue 
  6.  if item["parent"] == parent: 
  7.  cache.append(item["id"]) 
  8.  item["child"] = generate_tree(source, item["id"], cache) 
  9.  tree.append(item) 
  10.  return tree 

至此,無限級分類樹狀結構生成算法完成。你學會了嗎?

責任編輯:張燕妮 來源: segmentfault.com
相關推薦

2011-03-28 14:57:58

不重復隨機數列生成

2017-07-14 10:35:06

2021-11-07 14:33:48

算法Pairwise功能

2017-01-03 15:16:56

Tofsee僵尸網絡惡意軟件

2016-12-28 10:45:39

2021-03-22 10:05:03

算法可視化大數據

2012-02-16 08:27:14

安全漏洞RSA算法

2022-01-27 10:06:29

生成算法分布式

2021-06-11 06:10:09

Python數據結構算法

2023-06-14 15:51:48

JavaScript

2009-11-27 16:47:36

PHP無限分類

2018-04-12 11:20:16

MySQLmybatisJava

2021-04-15 09:36:44

Java數據結構算法

2015-10-30 16:09:23

分類算法總結

2015-10-09 10:59:26

算法分類

2021-08-24 23:23:35

Python工具開發

2020-12-23 11:08:10

Python代碼文本

2010-09-02 10:10:03

SQL刪除

2022-01-26 07:25:09

PythonRSA加解密
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲欧美综合精品另类天天更新 | 国产欧美日韩综合精品一区二区 | 91www在线观看| 日韩第一夜 | 久久久www成人免费精品 | 欧美成年视频 | 国产精品国产精品 | 日本电影韩国电影免费观看 | 九九久久99| 国产视频中文字幕在线观看 | 国产偷录视频叫床高潮对白 | 久久九 | 日韩一区二区三区精品 | 日韩精彩视频 | 91精品国产一区二区三区 | 人妖一区 | 91.色| 天天射色综合 | 国产欧美日韩在线一区 | 国产精品久久777777 | 精品国产一区二区三区免费 | 午夜国产羞羞视频免费网站 | 少妇精品久久久久久久久久 | 极情综合网 | 一区二区三区电影在线观看 | 国产精品日本一区二区在线播放 | 国产三级 | 久久久免费在线观看 | 精品熟人一区二区三区四区 | 中文字幕欧美在线观看 | 亚洲成人免费视频在线观看 | 久久精品99| 国产精品久久久久久久久久久久午夜片 | 久草电影网 | 色综合久久久 | 亚洲欧美在线观看 | 久久久久亚洲精品 | 在线中文字幕视频 | 精品欧美视频 | 一区二区免费在线观看 | 欧美成人免费在线视频 |