侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

Python  /  管理员 发布于 7年前   274

原始数据

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

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

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.pyimport jsonclass 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 nodestest_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 树状嵌套结构的实现思路详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


  • 上一条:
    Mac安装python3的方法步骤
    下一条:
    Python Django 母版和继承解析
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客