真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

怎么在Python中生成一個無限級分類樹狀結(jié)構(gòu)生成算法-創(chuàng)新互聯(lián)

今天就跟大家聊聊有關(guān)怎么在Python中生成一個無限級分類樹狀結(jié)構(gòu)生成算法,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

創(chuàng)新互聯(lián)公司自成立以來,一直致力于為企業(yè)提供從網(wǎng)站策劃、網(wǎng)站設計、網(wǎng)站制作、做網(wǎng)站、電子商務、網(wǎng)站推廣、網(wǎng)站優(yōu)化到為企業(yè)提供個性化軟件開發(fā)等基于互聯(lián)網(wǎng)的全面整合營銷服務。公司擁有豐富的網(wǎng)站建設和互聯(lián)網(wǎng)應用系統(tǒng)開發(fā)管理經(jīng)驗、成熟的應用系統(tǒng)解決方案、優(yōu)秀的網(wǎng)站開發(fā)工程師團隊及專業(yè)的網(wǎng)站設計師團隊。

首先,確保數(shù)據(jù)庫中存儲的類別信息如下:


[
 {"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,即家用電器屬于電器類產(chǎn)品。電吹風條目跟電器條目并無直接的標識進行關(guān)聯(lián),但需要用樹狀結(jié)構(gòu)來表明 電器 <- 家用電器 <- 電吹風 的關(guān)系。

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

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

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

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))

你試試運行一下,看看結(jié)構(gòu)是否符合預期。

使用緩存優(yōu)化算法

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

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

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

看完上述內(nèi)容,你們對怎么在Python中生成一個無限級分類樹狀結(jié)構(gòu)生成算法有進一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。


當前標題:怎么在Python中生成一個無限級分類樹狀結(jié)構(gòu)生成算法-創(chuàng)新互聯(lián)
網(wǎng)頁鏈接:http://weahome.cn/article/djiddd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部