原始數(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", "一級節(jié)點(diǎn)1", "root", "root"],
["node2", "一級節(jié)點(diǎn)2", "root", "root"],
["node11", "二級節(jié)點(diǎn)11", "root", "node1"],
["node12", "二級節(jié)點(diǎn)12", "root", "node1"],
["node21", "二級節(jié)點(diǎn)21", "root", "node2"],
["node22", "二級節(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)對象
"""
return [n for n in nodes if n.parent == self.name]
def __repr__(self):
return self.name
將原始數(shù)據(jù)轉(zhuǎn)換為節(jié)點(diǎn)對象
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)
測試
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)對象
: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)對象
"""
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)對象建立類 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))
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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