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

對python 樹狀嵌套結構的實現(xiàn)思路詳解

系統(tǒng) 1520 0

原始數(shù)據(jù)

原始數(shù)據(jù)大致是這樣子的:

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

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

節(jié)點類

抽象封裝出一個節(jié)點類:

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

 def __repr__(self):
 return self.name

          

將原始數(shù)據(jù)轉換為節(jié)點對象

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

為各個節(jié)點建立聯(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)
          

測試

            
root = nodes[0]
print(root)

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

          

運行結果:

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

原始數(shù)據(jù)也可以是字典的形式:

            
### fork_tool.py
import json


class Node(object):
 def __init__(self, **kwargs):
 """
 初始化
 :param nodes: 樹的全部節(jié)點對象
 :param kwargs: 當前節(jié)點參數(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é)點下的全部結構字典,即建立樹狀聯(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é)點下的全部節(jié)點對象
 """
 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)建時間
 # "desc": desc,
 # "origin": origin,
 # "parent": parent,
 # "children": [],
 # })

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

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

          

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


更多文章、技術交流、商務合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

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

【本文對您有幫助就好】

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

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 99精品免费久久久久久久久日本 | 国产拍在线 | 亚洲综合色视频 | 黑人巨大vs日本人优 | 亚洲国产成人久久一区www | 国产精品福利资源在线 | 国产精品久久久久久爽爽爽 | 99福利在线观看 | 国产拍在线| 欧日韩美香蕉在线观看 | 国产在线观看99 | 涩涩视频在线观看 | 成人午夜视频在线观看 | 男人天堂成人 | 极品女神西比尔久久精品 | 久草在在线| 视频播放在线观看精品视频 | 国产99视频精品草莓免视看 | 久久亚洲国产精品五月天 | 欧美高清激情毛片 | 亚洲精品香蕉一区二区 | 欧美亚洲国产日韩综合在线播放 | 综合图区亚洲 | 日本有色视频 | 午夜一级免费视频 | 国产精品国产高清国产专区 | 免费福利在线播放 | 日韩欧美在线视频 | 久久久性| 天天射天 | 久久cao| 色四月 | 精品午夜国产在线观看不卡 | 国产成人高清一区二区私人 | 成人老司机深夜福利久久 | 日韩视频在线观看一区二区 | 日韩中文字幕网站 | 99av在线 | 久久久国产精品网站 | 男人深夜网站 | 奇米影视亚洲春色 |