对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网络编程学习笔记(八):XML生成与解析(DOM、ElementTree)
Jun 09 Python
使用Python3编写抓取网页和只抓网页图片的脚本
Aug 20 Python
python中PIL安装简单教程
Apr 21 Python
利用numpy实现一、二维数组的拼接简单代码示例
Dec 15 Python
Python3内置模块之base64编解码方法详解
Jul 13 Python
python爬虫 正则表达式解析
Sep 28 Python
python jenkins 打包构建代码的示例代码
Nov 29 Python
Python tkinter和exe打包的方法
Feb 05 Python
python输入一个水仙花数(三位数) 输出百位十位个位实例
May 03 Python
Kears 使用:通过回调函数保存最佳准确率下的模型操作
Jun 17 Python
python3的pip路径在哪
Jun 23 Python
教你使用Pandas直接核算Excel中快递费用
May 12 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
ThinkPHP单字母函数(快捷方法)使用总结
2014/07/23 PHP
php中call_user_func函数使用注意事项
2014/11/21 PHP
php支付宝接口用法分析
2015/01/04 PHP
php+ajax实时刷新简单实例
2015/02/25 PHP
php图片水印添加、压缩、剪切的封装类实现
2020/04/18 PHP
laravel批量生成假数据的方法
2019/10/09 PHP
JavaScript加密解密7种方法总结分析
2007/10/07 Javascript
用jQuery扩展自写的 UI导航
2010/01/13 Javascript
JavaScript 空位补零实现代码
2010/02/26 Javascript
js String对象中常用方法小结(字符串操作)
2012/01/27 Javascript
jquery禁止输入数字以外的字符的示例(纯数字验证码)
2014/04/10 Javascript
一系列Bootstrap导航条使用方法分享
2016/04/29 Javascript
JQuery点击行tr实现checkBox选中的简单实例
2016/05/26 Javascript
js实现碰撞检测特效代码分享
2016/10/16 Javascript
js从输入框读取内容,比较两个数字的大小方法
2017/03/13 Javascript
jQuery位置选择器用法实例分析
2019/06/28 jQuery
Layui 导航默认展开和菜单栏选中高亮设置的方法
2019/09/04 Javascript
解决VueCil代理本地proxytable无效报错404的问题
2020/11/07 Javascript
vue添加自定义右键菜单的完整实例
2020/12/08 Vue.js
Python获取apk文件URL地址实例
2013/11/01 Python
python使用正则表达式分析网页中的图片并进行替换的方法
2015/03/26 Python
Python 经典面试题 21 道【不可错过】
2018/09/21 Python
使用Scrapy爬取动态数据
2018/10/21 Python
kafka-python批量发送数据的实例
2018/12/27 Python
python 视频逐帧保存为图片的完整实例
2019/12/10 Python
解决Python3.7.0 SSL低版本导致Pip无法使用问题
2020/09/03 Python
使用CSS3制作倾斜导航条和毛玻璃效果
2017/09/12 HTML / CSS
SportsDirect.com马来西亚:英国第一体育零售商
2018/11/21 全球购物
总务岗位职责
2013/11/19 职场文书
2014年学生资助工作总结
2014/12/18 职场文书
给老婆的保证书
2015/01/16 职场文书
全国爱牙日活动总结
2015/02/05 职场文书
入党积极分子培养人意见
2015/06/02 职场文书
四风之害观后感
2015/06/09 职场文书
pandas 实现将NaN转换为None
2021/05/14 Python
react 项目中引入图片的几种方式
2021/06/02 Javascript