对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提取内容关键词的方法
Mar 16 Python
Python使用logging结合decorator模式实现优化日志输出的方法
Apr 16 Python
使用Python的Flask框架构建大型Web应用程序的结构示例
Jun 04 Python
windows下Virtualenvwrapper安装教程
Dec 13 Python
Python爬虫框架scrapy实现downloader_middleware设置proxy代理功能示例
Aug 04 Python
python 定时器,实现每天凌晨3点执行的方法
Feb 20 Python
详解Python匿名函数(lambda函数)
Apr 19 Python
Python爬虫实现“盗取”微信好友信息的方法分析
Sep 16 Python
VSCode中自动为Python文件添加头部注释
Nov 14 Python
Python批量处理csv并保存过程解析
May 16 Python
使用openCV去除文字中乱入的线条实例
Jun 02 Python
Python实现快速大文件比较代码解析
Sep 04 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
索尼SONY ICF-SW7600GR电路分析与改良
2021/03/02 无线电
php 对输入信息的进行安全过滤的函数代码
2012/06/29 PHP
PHP验证信用卡卡号是否正确函数
2015/05/27 PHP
PHP基于递归算法解决兔子生兔子问题
2018/05/11 PHP
PHP中一个有趣的preg_replace函数详解
2018/08/15 PHP
php中array_fill函数的实例用法
2021/03/02 PHP
浅析JavaScript中的隐式类型转换
2013/12/05 Javascript
Javascript实现禁止输入中文或英文的例子
2014/12/09 Javascript
JS实现pasteHTML兼容ie,firefox,chrome的方法
2016/06/22 Javascript
Vue.js第二天学习笔记(vue-router)
2016/12/01 Javascript
利用node.js如何搭建一个简易的即时响应服务器
2017/05/28 Javascript
vue实现word,pdf文件的导出功能
2018/07/31 Javascript
JS函数节流和防抖之间的区分和实现详解
2019/01/11 Javascript
vue车牌号校验和银行校验实战
2019/01/23 Javascript
详解webpack打包vue项目之后生成的dist文件该怎么启动运行
2019/09/06 Javascript
vue 使用原生组件上传图片的实例
2020/09/08 Javascript
使用Python求解最大公约数的实现方法
2015/08/20 Python
详解flask入门模板引擎
2018/07/18 Python
python中实现控制小数点位数的方法
2019/01/24 Python
python opencv实现图像边缘检测
2019/04/29 Python
Django的models模型的具体使用
2019/07/15 Python
Python3 pickle对象串行化代码实例解析
2020/03/23 Python
基于pytorch中的Sequential用法说明
2020/06/24 Python
英国最大的网上药品商店:Chemist Direct
2017/12/16 全球购物
Groupon西班牙官方网站:在线优惠券和交易,节省高达70%
2021/03/13 全球购物
教师自我评价范文
2013/12/16 职场文书
管理学院毕业生自荐信范文
2014/03/10 职场文书
法人任命书范本
2014/06/04 职场文书
学生吸烟检讨书
2014/09/14 职场文书
教师党员个人整改措施材料
2014/09/16 职场文书
2014领导班子“四风问题”对照检查材料思想汇报(执法局)
2014/09/21 职场文书
免职证明样本
2014/10/23 职场文书
2015年医德考评自我评价
2015/03/03 职场文书
初一数学教学反思
2016/02/17 职场文书
2019大学竞选班长发言稿
2019/06/27 职场文书
Win11怎么修改电源模式?Win11修改电源模式的方法
2022/04/05 数码科技