欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python 無(wú)限級(jí)分類(lèi)樹(shù)狀結(jié)構(gòu)生成算法的實(shí)現(xiàn)

 更新時(shí)間:2021年01月21日 15:53:46   作者:今日長(zhǎng)劍在握  
這篇文章主要介紹了Python 無(wú)限級(jí)分類(lèi)樹(shù)狀結(jié)構(gòu)生成算法的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

后端研發(fā)的同學(xué)對(duì)無(wú)限級(jí)分類(lèi)肯定映像深刻,當(dāng)初花了不少時(shí)間吧?

無(wú)限級(jí)分類(lèi)樹(shù)狀結(jié)構(gòu)的應(yīng)用場(chǎng)景很多,例如后端研發(fā)需要把用戶(hù)相關(guān)權(quán)限讀取出來(lái)并生成樹(shù)狀結(jié)構(gòu),前端研發(fā)拿到權(quán)限樹(shù)之后可以按照結(jié)構(gòu)展示用戶(hù)有權(quán)限訪問(wèn)的欄目;再例如網(wǎng)頁(yè)上的欄目分級(jí):

作者在初次接觸樹(shù)狀結(jié)構(gòu)生成需求的時(shí)候,也是撓頭,后來(lái)找到了一個(gè)代碼少且清晰易懂的生成算法:遞歸。

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

[
 {"id": 1, "name": '電器', "parent": 0},
 {"id": 2, "name": '水果', "parent": 0},
 {"id": 3, "name": '家用電器', "parent": 1},
 {"id": 4, "name": '電吹風(fēng)', "parent": 3},
 {"id": 5, "name": '電風(fēng)扇', "parent": 3},
 {"id": 6, "name": '臺(tái)燈', "parent": 3},
 {"id": 7, "name": '商用電器', "parent": 1},
 {"id": 8, "name": '大型電熱鍋', "parent": 7},
]

字段 parent 記錄的是此條目的父編號(hào),例如電吹風(fēng)的父編號(hào)是 3,即電吹風(fēng)屬于家用電器,而家用電器的父編號(hào)是 1,即家用電器屬于電器類(lèi)產(chǎn)品。電吹風(fēng)條目跟電器條目并無(wú)直接的標(biāo)識(shí)進(jìn)行關(guān)聯(lián),但需要用樹(shù)狀結(jié)構(gòu)來(lái)表明 電器 <- 家用電器 <- 電吹風(fēng) 的關(guān)系。

通過(guò) parent 尋找父編號(hào),并建立關(guān)聯(lián)關(guān)系的操作實(shí)際上是循環(huán)往復(fù)的,直到找完所有的結(jié)點(diǎn),這跟遞歸算法非常契合,很輕松便能寫(xiě)出對(duì)應(yīng)的遞歸代碼:

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ù)庫(kù)中存儲(chǔ)的信息傳遞給 generate_tree 函數(shù)即可。這段遞歸代碼在往復(fù)循環(huán)的過(guò)程中通過(guò) parent 來(lái)尋找子結(jié)點(diǎn),找到子結(jié)點(diǎn)后將其添加到樹(shù)中。完整代碼如下:

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": '電吹風(fēng)', "parent": 2},
 {"id": 5, "name": '電風(fēng)扇', "parent": 3},
 {"id": 6, "name": '臺(tái)燈', "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))

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

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

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

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

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

至此,無(wú)限級(jí)分類(lèi)樹(shù)狀結(jié)構(gòu)生成算法完成。你學(xué)會(huì)了嗎?

到此這篇關(guān)于Python 無(wú)限級(jí)分類(lèi)樹(shù)狀結(jié)構(gòu)生成算法的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Python 無(wú)限級(jí)分類(lèi)樹(shù)狀結(jié)構(gòu)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • windows中python實(shí)現(xiàn)自動(dòng)化部署

    windows中python實(shí)現(xiàn)自動(dòng)化部署

    本文主要介紹了windows中python實(shí)現(xiàn)自動(dòng)化部署,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Python中super()的理解以及應(yīng)用場(chǎng)景實(shí)例

    Python中super()的理解以及應(yīng)用場(chǎng)景實(shí)例

    在python中關(guān)于類(lèi)的定義可以分為兩種:老式類(lèi)&新式類(lèi),在新式類(lèi)中有這么一種方法super( ),下面這篇文章主要給大家介紹了關(guān)于Python中super()的理解以及應(yīng)用場(chǎng)景的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • python中from module import * 的一個(gè)坑

    python中from module import * 的一個(gè)坑

    from module import *把module中的成員全部導(dǎo)到了當(dāng)前的global namespace,訪問(wèn)起來(lái)就比較方便了。當(dāng)然,python style一般不建議這么做,因?yàn)榭赡芤餹ame conflict。
    2014-07-07
  • python實(shí)現(xiàn)對(duì)svn操作及信息獲取

    python實(shí)現(xiàn)對(duì)svn操作及信息獲取

    這篇文章主要介紹了python實(shí)現(xiàn)對(duì)svn的操作及信息獲取示例過(guò)程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-10-10
  • MindSpore導(dǎo)入CUDA算子的解決方案

    MindSpore導(dǎo)入CUDA算子的解決方案

    本文介紹了在MindSpore標(biāo)準(zhǔn)格式下進(jìn)行CUDA算子開(kāi)發(fā)的方法和流程,可以讓開(kāi)發(fā)者在現(xiàn)有的AI框架下仍然可以調(diào)用基于CUDA實(shí)現(xiàn)的高性能的算子,感興趣的朋友跟隨小編一起看看吧
    2024-05-05
  • Python 爬蟲(chóng)學(xué)習(xí)筆記之正則表達(dá)式

    Python 爬蟲(chóng)學(xué)習(xí)筆記之正則表達(dá)式

    正則表達(dá)式是用來(lái)匹配字符串非常強(qiáng)大的工具,在其他編程語(yǔ)言中同樣有正則表達(dá)式的概念,Python同樣不例外,利用了正則表達(dá)式,我們想要從返回的頁(yè)面內(nèi)容提取出我們想要的內(nèi)容就易如反掌了。
    2016-09-09
  • Python基于socket實(shí)現(xiàn)TCP/IP客戶(hù)和服務(wù)器通信

    Python基于socket實(shí)現(xiàn)TCP/IP客戶(hù)和服務(wù)器通信

    本主要介紹了Python socket網(wǎng)絡(luò)編程TCP/IP服務(wù)器與客戶(hù)端通信的相關(guān)資料,這里對(duì)Scoket 進(jìn)行詳解并創(chuàng)建TCP服務(wù)器及TCP 客戶(hù)端實(shí)例代碼,需要的朋友可以參考下
    2021-06-06
  • python服務(wù)器中發(fā)送外部請(qǐng)求的基本步驟

    python服務(wù)器中發(fā)送外部請(qǐng)求的基本步驟

    在Python中,服務(wù)器發(fā)送外部請(qǐng)求是一個(gè)常見(jiàn)的操作,尤其是在需要集成不同服務(wù)或API時(shí),有多種庫(kù)可以幫助你完成這項(xiàng)任務(wù),但最流行和廣泛使用的庫(kù)之一是requests,下面給大家分享python服務(wù)器中發(fā)送外部請(qǐng)求的基本步驟,感興趣的朋友一起看看吧
    2024-08-08
  • python中property屬性的介紹及其應(yīng)用詳解

    python中property屬性的介紹及其應(yīng)用詳解

    這篇文章主要介紹了python中property屬性的介紹及其應(yīng)用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Python爬蟲(chóng)之爬取最新更新的小說(shuō)網(wǎng)站

    Python爬蟲(chóng)之爬取最新更新的小說(shuō)網(wǎng)站

    這篇文章主要介紹了Python爬蟲(chóng)之爬取最新更新的小說(shuō)網(wǎng)站,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python爬蟲(chóng)的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-05-05

最新評(píng)論