您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關怎么在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中生成一個無限級分類樹狀結構生成算法有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。