对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中enumerate函数代码解析
Oct 31 Python
Python排序搜索基本算法之归并排序实例分析
Dec 08 Python
Django跨域请求问题的解决方法示例
Jun 16 Python
查看python下OpenCV版本的方法
Aug 03 Python
Python爬虫基础之XPath语法与lxml库的用法详解
Sep 13 Python
python实现任意位置文件分割的实例
Dec 14 Python
让你Python到很爽的加速递归函数的装饰器
May 26 Python
Python读取实时数据流示例
Dec 02 Python
pytorch数据预处理错误的解决
Feb 20 Python
Python 合并拼接字符串的方法
Jul 28 Python
python实现AdaBoost算法的示例
Oct 03 Python
Python爬虫之爬取哔哩哔哩热门视频排行榜
Apr 28 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面向对象的方法重载两种版本比较
2008/09/08 PHP
php feof用来识别文件末尾字符的方法
2010/08/01 PHP
php制作的简单验证码识别代码
2016/01/26 PHP
Linux平台PHP5.4设置FPM线程数量的方法
2016/11/09 PHP
ZendFramework2连接数据库操作实例
2017/04/18 PHP
PHP+Ajax实现上传文件进度条动态显示进度功能
2018/06/04 PHP
PHP chop()函数讲解
2019/02/11 PHP
基于jQuery的消息提示插件之旅 DivAlert(三)
2010/04/01 Javascript
jQuery表单获取和失去焦点输入框提示效果的实例代码
2013/08/01 Javascript
js中reverse函数的用法详解
2013/12/26 Javascript
利用浏览器全屏api实现js全屏
2014/01/16 Javascript
一个JavaScript用逗号分割字符串实例
2014/09/22 Javascript
javascript中判断json的方法总结
2015/08/27 Javascript
关于cookie的初识和运用(js和jq)
2016/04/07 Javascript
js 点击a标签 获取a的自定义属性方法
2016/11/21 Javascript
js获取当前页的URL与window.location.href简单方法
2017/02/13 Javascript
分享19个JavaScript 有用的简写写法
2017/07/07 Javascript
解决vue 引入子组件报错的问题
2018/09/06 Javascript
JavaScript队列结构Queue实现过程解析
2020/03/07 Javascript
Python使用Scrapy爬虫框架全站爬取图片并保存本地的实现代码
2018/03/04 Python
解决python爬虫中有中文的url问题
2018/05/11 Python
pandas使用get_dummies进行one-hot编码的方法
2018/07/10 Python
使用Python制作自动推送微信消息提醒的备忘录功能
2018/09/06 Python
Python基于OpenCV实现人脸检测并保存
2019/07/23 Python
python list多级排序知识点总结
2019/10/23 Python
调整Jupyter notebook的启动目录操作
2020/04/10 Python
Python列表推导式实现代码实例
2020/09/09 Python
Windows下pycharm安装第三方库失败(通用解决方案)
2020/09/17 Python
使用Python Tkinter实现剪刀石头布小游戏功能
2020/10/23 Python
pycharm永久激活超详细教程
2020/10/29 Python
python基于pygame实现飞机大作战小游戏
2020/11/19 Python
报到证丢失证明
2014/01/11 职场文书
人事专员岗位职责范本
2014/03/04 职场文书
美容院店长岗位职责
2014/04/08 职场文书
英语分层教学实施方案
2014/06/15 职场文书
个人房屋租赁合同(标准范本)
2019/09/16 职场文书