圆月山庄资源网 Design By www.vgjia.com
原始数据
原始数据大致是这样子的:
每条数据中的四个数据分别是 当前节点名称,节点描述(指代一些需要的节点属性),源节点(即最顶层节点),父节点(当前节点上一层节点)。
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))
运行结果:
原始数据也可以是字典的形式:
### 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 树状嵌套结构的实现思路详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
标签:
python,树状,嵌套,结构
圆月山庄资源网 Design By www.vgjia.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
圆月山庄资源网 Design By www.vgjia.com
暂无评论...
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新日志
2024年11月05日
2024年11月05日
- 雨林唱片《赏》新曲+精选集SACD版[ISO][2.3G]
- 罗大佑与OK男女合唱团.1995-再会吧!素兰【音乐工厂】【WAV+CUE】
- 草蜢.1993-宝贝对不起(国)【宝丽金】【WAV+CUE】
- 杨培安.2009-抒·情(EP)【擎天娱乐】【WAV+CUE】
- 周慧敏《EndlessDream》[WAV+CUE]
- 彭芳《纯色角3》2007[WAV+CUE]
- 江志丰2008-今生为你[豪记][WAV+CUE]
- 罗大佑1994《恋曲2000》音乐工厂[WAV+CUE][1G]
- 群星《一首歌一个故事》赵英俊某些作品重唱企划[FLAC分轨][1G]
- 群星《网易云英文歌曲播放量TOP100》[MP3][1G]
- 方大同.2024-梦想家TheDreamer【赋音乐】【FLAC分轨】
- 李慧珍.2007-爱死了【华谊兄弟】【WAV+CUE】
- 王大文.2019-国际太空站【环球】【FLAC分轨】
- 群星《2022超好听的十倍音质网络歌曲(163)》U盘音乐[WAV分轨][1.1G]
- 童丽《啼笑姻缘》头版限量编号24K金碟[低速原抓WAV+CUE][1.1G]