对python 树状嵌套结构的实现思路详解


Posted in Python onAugust 09, 2019

原始数据

原始数据大致是这样子的:

每条数据中的四个数据分别是 当前节点名称,节点描述(指代一些需要的节点属性),源节点(即最顶层节点),父节点(当前节点上一层节点)。

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 树状嵌套结构的实现思路详解

原始数据也可以是字典的形式:

### 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 相关文章推荐
python Django连接MySQL数据库做增删改查
Nov 07 Python
Python查看多台服务器进程的脚本分享
Jun 11 Python
python中的多线程实例教程
Aug 27 Python
详解python3中的真值测试
Aug 13 Python
python 搭建简单的http server,可直接post文件的实例
Jan 03 Python
利用python脚本如何简化jar操作命令
Feb 24 Python
将python2.7添加进64位系统的注册表方式
Nov 20 Python
Pytorch之保存读取模型实例
Dec 30 Python
Python描述符descriptor使用原理解析
Mar 21 Python
tensorflow常用函数API介绍
Apr 19 Python
python实现杨辉三角的几种方法代码实例
Mar 02 Python
用Python将GIF动图分解成多张静态图片
Jun 11 Python
Python  Django 母版和继承解析
Aug 09 #Python
python实现爬虫抓取小说功能示例【抓取金庸小说】
Aug 09 #Python
python实现BP神经网络回归预测模型
Aug 09 #Python
Django ORM 聚合查询和分组查询实现详解
Aug 09 #Python
解决Django后台ManyToManyField显示成Object的问题
Aug 09 #Python
详解Python中的正斜杠与反斜杠
Aug 09 #Python
图文详解Django使用Pycharm连接MySQL数据库
Aug 09 #Python
You might like
PHP设计模式之结构模式的深入解析
2013/06/13 PHP
一个图片地址分解程序(用于PHP小偷程序)
2014/08/23 PHP
php数组索引与键值操作技巧实例分析
2015/06/24 PHP
PHP使用file_get_content设置头信息的方法
2016/02/14 PHP
php实现微信模板消息推送
2018/03/30 PHP
解决php extension 加载顺序问题
2019/08/16 PHP
Flex通过JS获取客户端IP和计算机名的实例代码
2013/11/21 Javascript
jquery获取css中的选择器(实例讲解)
2013/12/02 Javascript
基于jQuery实现下拉框
2014/11/24 Javascript
js中document.write的那点事
2014/12/12 Javascript
jQuery中常用的遍历函数用法实例总结
2015/09/01 Javascript
JavaScript中使用sencha gridpanel 编辑单元格、改变单元格颜色
2015/11/26 Javascript
微信小程序 生命周期函数详解
2017/05/24 Javascript
JavaScript禁止右击保存图片,禁止拖拽图片的实现代码
2020/04/28 Javascript
ant design vue嵌套表格及表格内部编辑的用法说明
2020/10/28 Javascript
微信小程序自定义胶囊样式
2020/12/27 Javascript
让python在hadoop上跑起来
2016/01/27 Python
Python查询IP地址归属完整代码
2017/06/21 Python
Python解析json之ValueError: Expecting property name enclosed in double quotes: line 1 column 2(char 1)
2017/07/06 Python
numpy排序与集合运算用法示例
2017/12/15 Python
Python和Java进行DES加密和解密的实例
2018/01/09 Python
python实现SOM算法
2018/02/23 Python
Django 中使用流响应处理视频的方法
2018/07/20 Python
对python 自定义协议的方法详解
2019/02/13 Python
Python实现通过解析域名获取ip地址的方法分析
2019/05/17 Python
python判断一个对象是否可迭代的例子
2019/07/22 Python
Flask框架学习笔记之路由和反向路由详解【图文与实例】
2019/08/12 Python
python3.6生成器yield用法实例分析
2019/08/23 Python
python实现的登录与提交表单数据功能示例
2019/09/25 Python
Python使用Paramiko控制liunx第三方库
2020/05/20 Python
Python实现ElGamal加密算法的示例代码
2020/06/19 Python
大学新生欢迎词
2014/01/10 职场文书
中文专业学生自我评价范文
2014/02/06 职场文书
夫妻婚内购房协议书
2014/10/05 职场文书
2015年班干部工作总结
2015/04/29 职场文书
python游戏开发Pygame框架
2022/04/22 Python