亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

對python 樹狀嵌套結構的實現思路詳解

系統 1737 0

原始數據

原始數據大致是這樣子的:

每條數據中的四個數據分別是 當前節點名稱,節點描述(指代一些需要的節點屬性),源節點(即最頂層節點),父節點(當前節點上一層節點)。

            
datas = [
 ["root", "根節點", "root", None],
 ["node1", "一級節點1", "root", "root"],
 ["node2", "一級節點2", "root", "root"],
 ["node11", "二級節點11", "root", "node1"],
 ["node12", "二級節點12", "root", "node1"],
 ["node21", "二級節點21", "root", "node2"],
 ["node22", "二級節點22", "root", "node2"],
]
          

節點類

抽象封裝出一個節點類:

            
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):
 """
 獲取該節點下的全部結構字典
 """
 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):
 """
 獲取該節點下的全部節點對象
 """
 return [n for n in nodes if n.parent == self.name]

 def __repr__(self):
 return self.name

          

將原始數據轉換為節點對象

            
nodes = list()
for data in datas:
 node = Node(data[0], data[1], data[-1], [])
 nodes.append(node)
          

為各個節點建立聯系

            
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)
          

測試

            
root = nodes[0]
print(root)

tree = root.get_nodes()
print(json.dumps(tree, indent=4))

          

運行結果:

對python 樹狀嵌套結構的實現思路詳解_第1張圖片

原始數據也可以是字典的形式:

            
### fork_tool.py
import json


class Node(object):
 def __init__(self, **kwargs):
 """
 初始化
 :param nodes: 樹的全部節點對象
 :param kwargs: 當前節點參數
 """

 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):
 """
 獲取該節點下的全部結構字典,即建立樹狀聯系
 """
 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):
 """
 獲取該節點下的全部節點對象
 """
 return [n for n in nodes if n.parent == self.forked_id]

 # def __repr__(self):
 # return str(self.desc)


def process_datas(datas):
 """
 處理原始數據
 :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, # 分支創建時間
 # "desc": desc,
 # "origin": origin,
 # "parent": parent,
 # "children": [],
 # })

 nodes = []
 # 構建節點列表集
 for data in datas:
 node = Node(**data)
 nodes.append(node)

 # 為各個節點對象建立類 nosql 結構的聯系
 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))

          

以上這篇對python 樹狀嵌套結構的實現思路詳解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产精品一区三区 | 欧美资源站| www.久久爱| 欧美日韩成人高清色视频 | 日日操操干干 | 亚洲欧美日韩成人网 | 日本久久精品视频 | 夜鲁夜鲁夜鲁在线观看福利 | 好吊妞免费视频 | 青青青激情视频在线最新 | 在线视频福利 | 99热这里只有精品2 99热这里只有精品3 | 亚洲欧美国产精品久久久 | 日韩中文字幕久久精品 | 久青草国产免费观看 | 亚洲qingse| 国产亚洲精 | 春色www在线视频观看 | 性猛交╳xxx乱大交 性猛交毛片 | 天天爽夜夜爽免费看 | 91精品久久国产青草 | 手机看片精品高清国产日韩 | 99热这里只有精品5 99热这里只有精品66 | 99re9精品视频在线 | 草久视频在线 | 99re这里只有精品在线 | 久久国产亚洲精品 | 久久99久久99精品观看 | 国产一久久香蕉国产线看观看 | 国产精品伦理 | 欧美视频在线观看 | 91中文字幕在线播放 | 破外女出血一级毛片 | 国产aⅴ精品一区二区三区久久 | 五月婷激情 | 国产免费人成在线视频视频 | 中国性猛交xxxxx免费看 | 欧美成年黄网站色视频 | 欧美亚洲网站 | 欧美福利精品福利视频在线观看 | 日韩欧美在线观看成人 |