對(duì)python 樹狀嵌套結(jié)構(gòu)的實(shí)現(xiàn)思路詳解
原始數(shù)據(jù)
原始數(shù)據(jù)大致是這樣子的:
每條數(shù)據(jù)中的四個(gè)數(shù)據(jù)分別是 當(dāng)前節(jié)點(diǎn)名稱,節(jié)點(diǎn)描述(指代一些需要的節(jié)點(diǎn)屬性),源節(jié)點(diǎn)(即最頂層節(jié)點(diǎn)),父節(jié)點(diǎn)(當(dāng)前節(jié)點(diǎn)上一層節(jié)點(diǎn))。
datas = [ ["root", "根節(jié)點(diǎn)", "root", None], ["node1", "一級(jí)節(jié)點(diǎn)1", "root", "root"], ["node2", "一級(jí)節(jié)點(diǎn)2", "root", "root"], ["node11", "二級(jí)節(jié)點(diǎn)11", "root", "node1"], ["node12", "二級(jí)節(jié)點(diǎn)12", "root", "node1"], ["node21", "二級(jí)節(jié)點(diǎn)21", "root", "node2"], ["node22", "二級(jí)節(jié)點(diǎn)22", "root", "node2"], ]
節(jié)點(diǎn)類
抽象封裝出一個(gè)節(jié)點(diǎn)類:
class Node(object): def __init__(self, name: str, desc, parent: str, children: list): """ 初始化 :param name: :param desc: :param parent: :param children: """ self.name = name self.desc = desc self.parent = parent self.children = children def get_nodes(self): """ 獲取該節(jié)點(diǎn)下的全部結(jié)構(gòu)字典 """ d = dict() d['name'] = self.name d['desc'] = self.desc d['parent'] = self.parent children = self.get_children() if children: d['children'] = [child.get_nodes() for child in children] return d def get_children(self): """ 獲取該節(jié)點(diǎn)下的全部節(jié)點(diǎn)對(duì)象 """ return [n for n in nodes if n.parent == self.name] def __repr__(self): return self.name
將原始數(shù)據(jù)轉(zhuǎn)換為節(jié)點(diǎn)對(duì)象
nodes = list() for data in datas: node = Node(data[0], data[1], data[-1], []) nodes.append(node)
為各個(gè)節(jié)點(diǎn)建立聯(lián)系
for node in nodes: children_names = [data[0] for data in datas if data[-1] == node.name] children = [node for node in nodes if node.name in children_names] node.children.extend(children)
測(cè)試
root = nodes[0] print(root) tree = root.get_nodes() print(json.dumps(tree, indent=4))
運(yùn)行結(jié)果:
原始數(shù)據(jù)也可以是字典的形式:
### fork_tool.py import json class Node(object): def __init__(self, **kwargs): """ 初始化 :param nodes: 樹的全部節(jié)點(diǎn)對(duì)象 :param kwargs: 當(dāng)前節(jié)點(diǎn)參數(shù) """ self.forked_id = kwargs.get("forked_id") self.max_drawdown = kwargs.get("max_drawdown") self.annualized_returns = kwargs.get("annualized_returns") self.create_time = kwargs.get("create_time") self.desc = kwargs.get("desc") self.origin = kwargs.get("origin") self.parent = kwargs.get("parent") self.children = kwargs.get("children", []) def get_nodes(self, nodes): """ 獲取該節(jié)點(diǎn)下的全部結(jié)構(gòu)字典,即建立樹狀聯(lián)系 """ d = dict() d['forked_id'] = self.forked_id d['max_drawdown'] = self.max_drawdown d['annualized_returns'] = self.annualized_returns d['create_time'] = self.create_time d['desc'] = self.desc d['origin'] = self.origin d['parent'] = self.parent children = self.get_children(nodes) if children: d['children'] = [child.get_nodes(nodes) for child in children] return d def get_children(self, nodes): """ 獲取該節(jié)點(diǎn)下的全部節(jié)點(diǎn)對(duì)象 """ return [n for n in nodes if n.parent == self.forked_id] # def __repr__(self): # return str(self.desc) def process_datas(datas): """ 處理原始數(shù)據(jù) :param datas: :return: """ # forked_infos.append({"forked_id": str(forked_strategy.get("_id")), # "max_drawdown": max_drawdown, # "annualized_returns": annualized_returns, # "create_time": create_time, # 分支創(chuàng)建時(shí)間 # "desc": desc, # "origin": origin, # "parent": parent, # "children": [], # }) nodes = [] # 構(gòu)建節(jié)點(diǎn)列表集 for data in datas: node = Node(**data) nodes.append(node) # 為各個(gè)節(jié)點(diǎn)對(duì)象建立類 nosql 結(jié)構(gòu)的聯(lián)系 for node in nodes: children_ids = [data["forked_id"] for data in datas if data["parent"] == node.forked_id] children = [node for node in nodes if node.forked_id in children_ids] node.children.extend(children) return nodes test_datas = [ {'annualized_returns': 0.01, 'children': [], 'create_time': 1562038393, 'desc': 'root', 'forked_id': '5d1ad079e86117f3883f361e', 'max_drawdown': 0.01, 'origin': None, 'parent': None}, {'annualized_returns': 0.314, 'children': [], 'create_time': 1562060612, 'desc': 'level1', 'forked_id': '5d1b2744b264566d3f3f3632', 'max_drawdown': 0.2, 'origin': '5d1ad079e86117f3883f361e', 'parent': '5d1ad079e86117f3883f361e'}, {'annualized_returns': 0.12, 'children': [], 'create_time': 1562060613, 'desc': 'level11', 'forked_id': '5d1b2745e86117f3883f3632', 'max_drawdown': None, 'origin': '5d1ad079e86117f3883f361e', 'parent': '5d1b2744b264566d3f3f3632'}, {'annualized_returns': 0.09, 'children': [], 'create_time': 1562060614, 'desc': 'level12', 'forked_id': '5d1b2746b264566d3f3f3633', 'max_drawdown': None, 'origin': '5d1ad079e86117f3883f361e', 'parent': '5d1b2744b264566d3f3f3632'}, {'annualized_returns': None, 'children': [], 'create_time': 1562060614, 'desc': 'level2', 'forked_id': '5d1b2746e86117f3883f3633', 'max_drawdown': None, 'origin': '5d1ad079e86117f3883f361e', 'parent': '5d1ad079e86117f3883f361e'}, {'annualized_returns': None, 'children': [], 'create_time': 1562060627, 'desc': 'level21', 'forked_id': '5d1b2753b264566d3f3f3635', 'max_drawdown': None, 'origin': '5d1ad079e86117f3883f361e', 'parent': '5d1b2746e86117f3883f3633'}, {'annualized_returns': None, 'children': [], 'create_time': 1562060628, 'desc': 'level211', 'forked_id': '5d1b2754b264566d3f3f3637', 'max_drawdown': None, 'origin': '5d1ad079e86117f3883f361e', 'parent': '5d1b2753b264566d3f3f3635'}, {'annualized_returns': None, 'children': [], 'create_time': 1562060640, 'desc': 'level212', 'forked_id': '5d1b2760e86117f3883f3634', 'max_drawdown': None, 'origin': '5d1ad079e86117f3883f361e', 'parent': '5d1b2753b264566d3f3f3635'}, ] if __name__ == "__main__": nodes = process_datas(test_datas) info = nodes[0].get_nodes(nodes) print(json.dumps(info, indent=4))
以上這篇對(duì)python 樹狀嵌套結(jié)構(gòu)的實(shí)現(xiàn)思路詳解就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python驗(yàn)證碼識(shí)別實(shí)例代碼
這篇文章主要介紹了python驗(yàn)證碼識(shí)別實(shí)例代碼,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02YOLOv5車牌識(shí)別實(shí)戰(zhàn)教程(一)引言與準(zhǔn)備工作
這篇文章主要介紹了YOLOv5車牌識(shí)別實(shí)戰(zhàn)教程(一)引言與準(zhǔn)備工作,在這個(gè)教程中,我們將一步步教你如何使用YOLOv5進(jìn)行車牌識(shí)別,幫助你快速掌握YOLOv5車牌識(shí)別技能,需要的朋友可以參考下2023-04-04Python socket服務(wù)常用操作代碼實(shí)例
這篇文章主要介紹了Python socket服務(wù)常用操作代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06Anaconda下Python中GDAL模塊的下載與安裝過程
這篇文章主要介紹了Anaconda下Python中GDAL模塊的下載與安裝方法,本文介紹在Anaconda環(huán)境下,安裝Python中柵格、矢量等地理數(shù)據(jù)處理庫GDAL的方法,需要的朋友可以參考下2023-04-04Python NumPy創(chuàng)建數(shù)組方法
這篇文章主要介紹了Python NumPy創(chuàng)建數(shù)組方法,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-09-09人工智能——K-Means聚類算法及Python實(shí)現(xiàn)
這篇文章主要介紹了人工智能——K-Means聚類算法及Python實(shí)現(xiàn),一個(gè)能夠找到我圈出的這?些點(diǎn)集的算法,就被稱為聚類算法,下面就來看看文章具體的介紹吧2022-01-01pandas.DataFrame.to_json按行轉(zhuǎn)json的方法
今天小編就為大家分享一篇pandas.DataFrame.to_json按行轉(zhuǎn)json的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-06-06python實(shí)現(xiàn)處理Excel表格超詳細(xì)系列
這篇文章主要介紹了python實(shí)現(xiàn)處理Excel表格超詳細(xì)系列,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08Python使用Flask框架同時(shí)上傳多個(gè)文件的方法
這篇文章主要介紹了Python使用Flask框架同時(shí)上傳多個(gè)文件的方法,實(shí)例分析了Python中Flask框架操作文件實(shí)現(xiàn)上傳的技巧,需要的朋友可以參考下2015-03-03