亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python如何實現無限級分類樹狀結構生成算法

發布時間:2021-10-11 18:31:57 來源:億速云 閱讀:158 作者:柒染 欄目:web開發

本篇文章給大家分享的是有關Python如何實現無限級分類樹狀結構生成算法,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

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

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,即家用電器屬于電器類產品。電吹風條目跟電器條目并無直接的標識進行關聯,但需要用樹狀結構來表明 電器 <- 家用電器 <- 電吹風 的關系。

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

通過 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

至此,無限級分類樹狀結構生成算法完成。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

随州市| 中宁县| 黑河市| 嘉义市| 闸北区| 喀喇沁旗| 池州市| 古丈县| 确山县| 九江县| 青岛市| 车险| 龙海市| 广河县| 乌海市| 高州市| 新津县| 永登县| 株洲市| 锦屏县| 姚安县| 永善县| 都匀市| 扎囊县| 巴中市| 南溪县| 长沙市| 义马市| 大庆市| 巴马| 景洪市| 织金县| 凌云县| 广宁县| 浦东新区| 新民市| 三江| 凭祥市| 万山特区| 泰来县| 略阳县|