亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:3日期:2022-06-29 13:46:44

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

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

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 jsondef generate_tree(source, parent): tree = [] for item in source: if item['parent'] == parent: item['child'] = generate_tree(source, item['id']) tree.append(item) return treeif __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 編程
相關文章:
主站蜘蛛池模板: 国产成人一区二区三区在线播放 | 一级毛片国产 | 久久2| 国产91免费在线 | 成人免费精品视频 | 日本欧美大码aⅴ在线播放 日本欧美不卡一区二区三区在线 | 国产成人精品aaaa视频一区 | 欧美日韩性生活 | 日韩在线一区视频 | 美女国内精品自产拍在线播放 | 亚洲精品一区二区三区网址 | 久久99国产亚洲精品观看 | 亚洲国产三级 | 久久9精品 | 日韩在线视 | 亚洲 成人 欧美 自拍 | 日本久久久久中文字幕 | 午夜视频在线观看一区 | 一级毛片美国一级j毛片不卡 | 亚洲精品香蕉一区二区在线观看 | 精品视频手机在线观看免费 | 国产免费一级高清淫曰本片 | 最新日韩中文字幕 | 欧美aaaa在线观看视频免费 | 黄色在线观看网址 | 天天插综合网 | 国产精品一级香蕉一区 | 日本一级淫片a 免费播放口 | 欧美大陆日韩一区二区三区 | 韩国一级特黄清高免费大片 | 欧美日韩精品一区二区三区视频播放 | 国产成人亚洲精品大帝 | 打床炮视频在线观看免费 | 国产视频二区在线观看 | 日韩女人毛片在线播放 | 亚洲精品人成网在线播放影院 | 亚洲精品美女一区二区三区乱码 | 欧美日韩一区二区三区色综合 | 最新九九精品 | 亚洲国产精品综合久久久 | 国产精品永久免费视频 |