欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

對(duì)python 樹狀嵌套結(jié)構(gòu)的實(shí)現(xiàn)思路詳解

系統(tǒng) 1612 0

原始數(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é)果:

對(duì)python 樹狀嵌套結(jié)構(gòu)的實(shí)現(xiàn)思路詳解_第1張圖片

原始數(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è)參考,也希望大家多多支持腳本之家。


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

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

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

【本文對(duì)您有幫助就好】

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

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 香港全黄一级毛片在线播放 | 国产成人综合亚洲动漫在线 | 伊人a.v在线| 色黄视频在线观看 | 亚洲一区二区三区福利在线 | 男女真实有遮挡xx00动态图 | 欧美在线观看视频一区 | 国产亚洲美女精品久久久久 | 高清不卡一区 | 日日爱夜夜爽 | 国产欧美精品亚洲桃花岛 | 欧美日批 | 欧美日韩一区二区在线观看视频 | 成人午夜视频免费 | 亚洲精品视频免费观看 | 久草新在线 | 国产成人精品午夜 | 国产成人高清 | 日本三级一区 | www.com黄| 91国内精品久久久久怡红院 | 亚洲综合图片色婷婷另类小说 | 五月婷婷开心综合 | 成人性生活视频在线播放 | 国产美女亚洲精品久久久综合 | 日韩六九视频 | 成人在线视频网站 | 亚洲精品久久久蜜桃 | 美剧三体 | 亚洲精品久中文字幕 | 一区二区三区精品视频 | 无线日本视频精品 | 91亚洲精品在线观看 | 久久精品国产99国产精品 | 4hu四虎永久免在线视看 | 天堂综合网久久 | 在线亚洲精品 | 精品久久久久久蜜臂a∨ | 黄色精品视频 | 国产色网| 日本久久黄色 |