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

原始数据

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

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

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))

1

运行结果:

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

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

(0)

相关推荐

  • 关于python之字典的嵌套,递归调用方法

    一 字典的嵌套 在机器学习实战决策树部分,生成决策树时用到了字典的嵌套. >>>s1={'no surface':{}} >>>s1['no surfacce'][0]='no' >>>s1 {'no surface':{0:'no'}} >>>s2={'flipper':{}} >>>s2['flipper'][0]='no' >>>s2['flipper'][1]='yes' >>&

  • 用Python编写生成树状结构的文件目录的脚本的教程

    有时候需要罗列下U盘等移动设备或一个程序下面的目录结构的需求.基于这样的需求个人整理了一个使用Python的小工具,期望对有这方面需求的朋友有所帮助.以下为具体代码: 如果你所有要求的文件目录不需要完整的文件路径的话,直接更换下面的注释代码即可~ # -*- coding:utf-8 -*- import os def list_files(startPath): fileSave = open('list.txt','w') for root, dirs, files in os.walk(s

  • python实现嵌套列表平铺的两种方法

    方法一:使用列表推导式 >>> vec = [[1,2,3],[4,5,6],[7,8,9]] >>> get = [num for elem in vec for num in elem] >>> get [1, 2, 3, 4, 5, 6, 7, 8, 9] 方法相当于 >>> vec = [[1,2,3],[4,5,6],[7,8,9]] >>> result = [] >>> for ele

  • 利用Django模版生成树状结构实例代码

    前言 我们经常会有这样的需求,比如评论功能,每个评论都有可能会有自己的子评论,如果在界面只展示成一列的话非常不美观,也不能体现出他们的层级关系.那么我们今天就来看看如何使用Django的模版来生成树状结构,以本站为例,效果如下图所示: 那么我们要怎么实现呢?首先先看看评论实体的定义,如下所示: class Comment(models.Model): body = models.TextField('正文', max_length=300) author = models.ForeignKey(

  • python中多层嵌套列表的拆分方法

    场景:有一个多层嵌套的列表如:[[23],[3,3],[22,22],1,123,[[123,a],2]] 拆分成: def splitlist(list): ''' 现有一个列表,里面元素包括 数字,字母,列表,字典等元素,现在要将字典去掉,并将列表 分解成字母,或数字元素如:[[1,2,3],2,3,[1,3,[12,22]],'a',12] 经函数处理后[1, 2, 3, 2, 3, 1, 3, 12, 22, 'a', 12] ''' alist = [] a = 0 for subli

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

    原始数据 原始数据大致是这样子的: 每条数据中的四个数据分别是 当前节点名称,节点描述(指代一些需要的节点属性),源节点(即最顶层节点),父节点(当前节点上一层节点). datas = [ ["root", "根节点", "root", None], ["node1", "一级节点1", "root", "root"], ["node2", &qu

  • 使用 Python 在京东上抢口罩的思路详解

    全国抗"疫"这么久终于见到曙光,在家待了将近一个月,现在终于可以去上班了,可是却发现出门必备的口罩却一直买不到.最近看到京东上每天都会有口罩的秒杀活动,试了几次却怎么也抢不到,到了抢购的时间,浏览器的页面根本就刷新不出来,等刷出来秒杀也结束了.现在每天只放出一万个,却有几百万人在抢,很想知道别人是怎么抢到的,于是就在网上找了大神公开出来的抢购代码.看了下代码并不复杂,现在我们就报着学习的态度一起看看. 使用模块 首先打开项目中 requirements.txt 文件,看下它都需要哪些模

  • python编写微信公众号首图思路详解

    前言 之前一直在美图秀秀调整自己的微信公众号首图,效果也不尽如人意,老是调来调去,最后发出来的图片被裁剪了一大部分,丢失部分关键信息,十分恼火,于是想着用python写一个程序,把微信公众号首图的模式固定下来,方便以后写公众号. 思路 根据微信公众号首图要求,可以上传一个不超过5M的图片,且图片尺寸要是2.35:1的尺寸,换算成像素是900:383,有了这些参数就可以做文章了,这里有两种思路 把今天推文的标题(文字)用图片展示出来,使得文字排列错落有致,简单粗暴,而又不失美感,这里可以利用mat

  • python实现密码验证合格程序的思路详解

    题目描述 输入一行或多行字符串密码,验证每行密码是否符合规范,符合提示"OK",否则"NG".密码规范为: 1.长度超过8位 2.包括大小写字母.数字.其它符号,以上四种至少三种 3.不能有相同长度超2的子串重复 解题思路 1.获取输入的多行字符串 2.对每行字符串进行密码验证: 1)如果密码长度小于等于8或者是密码中有长度超过2的重复子串,则密码NG 2)在1)不满足的情况下再看有没有至少包含大写字母.小写字母.数字.其他符号 python代码实现 import

  • 使用 Python 破解压缩文件的密码的思路详解

    经常遇到百度网盘的压缩文件加密了,今天我们就破解它! 实现思路 上篇文章给大家介绍了爆破密码的思路,感兴趣的朋友可以了解下. 其实都大同小异:无非就是字典爆破,就看你是有现成密码字典,还是自己生成密码字典,然后进行循环输入密码,直到输入正确位置.现在很多都有防爆破限制,根本无法进行暴力破解,但是似乎zip这种大家都是用比较简单的密码而且没有什么限制. 因此 实现思路就是 生成字典->输入密码->成功解压 实现过程 1.  生成字典 生成密码字典其实就是一个字符组合的过程.小伙伴们可别用列表去组

  • C语言顺序表的基本结构与实现思路详解

    目录 一.顺序表的概念与结构 1.线性表的解释 2.顺序表概念解释 二.顺序表的思路及代码实现详解 1.静态顺序表的实现 2.动态顺序表思路及代码实现 2.1 动态顺序表的整体思路 2.2 定义结构体的实现 2.3 初始化结构体 2.4 结构体打印 2.5 检查数组容量 2.6 头插 2.7 尾插 2.8 头删 2.9 尾删 2.10 任意删除 2.11 任意插入 2.12 空间释放 三.顺序表代码整合 SeqList.h SeqList.c test.c 一.顺序表的概念与结构 1.线性表的解

  • 用Python制作灯光秀短视频的思路详解

    一.引言 2021年4月8日武汉重启一周年,这是个值得庆祝的日子,作为一个武汉人和一个死宅程序员,老猿也想在这个日子留下点什么.想起武汉长江两岸的灯光秀,顿时有了主意,那就用程序实现一个武汉重启庆祝的灯光秀短视频吧,于是在4月7日晚开始构思和着手开发,4月8日晚终于顺利完成,并且通过使用OpenCV.OpenCV+Moviepy两种方式进行了实现. 本文介绍结合Python+OpenCV+Moviepy实现的思路和过程,Python+OpenCV实现的思路和过程将在另外的博文中单独介绍. 二.实

  • python列表切片和嵌套列表取值操作详解

    给出列表切片的格式: [开头元素::步长] # 输出直到最后一个元素,(最后一个冒号和步长可以省略,下同) [开头元素:结尾元素(不含):步长] # 其中,-1表示list最后一个元素 首先来看最简单的单一列表: a = [1,2,3,4] a[:] a[::] a[:3] a[1:3:2] a[3] 输出依次为: [1,2,3,4] [1,2,3,4] [1,2,3] [2] 4 注意,这里只有最后一个输出是不带[]的,表明只有最后一个输出是元素,其他在切片中只用了:符号的输出均为list,不

  • 基于Python Numpy的数组array和矩阵matrix详解

    NumPy的主要对象是同种元素的多维数组.这是一个所有的元素都是一种类型.通过一个正整数元组索引的元素表格(通常是元素是数字). 在NumPy中维度(dimensions)叫做轴(axes),轴的个数叫做秩(rank,但是和线性代数中的秩不是一样的,在用python求线代中的秩中,我们用numpy包中的linalg.matrix_rank方法计算矩阵的秩,例子如下). 结果是: 线性代数中秩的定义:设在矩阵A中有一个不等于0的r阶子式D,且所有r+1阶子式(如果存在的话)全等于0,那末D称为矩阵

  • 对python while循环和双重循环的实例详解

    废话不多说,直接上代码吧! #python中,while语句用于循环执行程序,即在某个条件下,循环执行某段程序,以处理需要重复处理的相同任务. #while是"当型"循环结构. i=1 while i<=20: print(i,end=" ") i+=1 sum=0 i=1 while i<=100: sum+=i i+=1 else: print("\n",sum) print("0+2+...+100=",su

随机推荐