让我们假设我们有一棵树的不利表示.此树不是嵌套的,而是扁平化的,其 node 仅通过ID"连接":

{
   "nodes":[
      {
         "id":0,
         "value":"and",
         "children":[
            1,
            4
         ]
      }
      {
         "id":1,
         "value":"or",
         "children":[
            2,
            3
         ]
      },
      {
         "id":4,
         "value":"or",
         "children":[
            5,
            6
         ]
      }
   ],
   "leafs":[
      {
         "id":2,
         "value":"some statement"
      },
      {
         "id":3,
         "value":"some statement"
      },
      {
         "id":5,
         "value":"some statement"
      },
      {
         "id":6,
         "value":"some statement"
      }
   ]
}

您可以看到,树不仅是扁平的,还有一个相当不必要的表示作为专用列表的树叶. 因此,叶的ID出现两次:一次作为其父 node 中的子 node ,一次作为叶的标识符.

我想要的是该树的嵌套表示形式,即专用的python对象.我必须用整个对象替换"id",并go 掉过于复杂的列表表示.

这就是我想要的:

{
  "tree": {
    "id": 0,
    "value": "and",
    "children": [
      {
        "id": 1,
        "value": "or",
        "children": [
          {
            "id": 2,
            "value": "some statement"
          },
          {
            "id": 3,
            "value": "some statement"
          }
        ]
      },
      {
        "id": 4,
        "value": "or",
        "children": [
          {
            "id": 6,
            "value": "some statement"
          },
          {
            "id": 6,
            "value": "some statement"
          }
        ]
      }
    ]
  }
}

我应该如何开始解析这两个列表,以便构建相互引用并仅通过引用表示该树 struct 的Python对象( node 和叶类).

class Node:
    def __init__(self, id, operator):
        self.id = id
        self.value= operator
        self.children = None

class Leaf:
    def __init__(self, id, operator):
        self.id = id
        self.value = None

这些是我的树类,但我不知道如何遍历这两个列表,以一种将我带到所需树的方式.

推荐答案

可以将树数据转换为字典,键为id,值为NODE_DATA.

Code:


class Node:
    def __init__(self, node_id: int, operator: str, children: Optional[list] = None):
        self.id = node_id
        self.value = operator
        self.children = children

    def __repr__(self):
        return f'Node(id={self.id}, value={self.value})'


def build_tree(start: int, nodes: dict):
    node_data = nodes[start]
    node = Node(node_data['id'], node_data['value'])
    if node_data.get('children'):
        node.children = [build_tree(child, nodes) for child in node_data.get('children')]
    return node


nodes = {node['id']: node for node in data['leafs']}
nodes.update({node['id']: node for node in data['nodes']})

root = build_tree(0, nodes)

在代码中,我创建了一个维护所有值的类Node,叶 node children的参数将为None.

Update:

如果您使用Node级作为PUDNIC模型

class Node(BaseModel):
    id: int
    value: str
    children: Optional[List['Node']]

    def to_dict(self) -> dict:
        return {'tree': self.dict()}

在上面这个简单模型中,我添加了to_dict()个方法,该方法将返回树的字典表示

Sample Output:

{
    'tree': {
        'id': 0,
        'value': 'and',
        'children': [
            {
                'id': 1,
                'value': 'or',
                'children': [
                    {'id': 2, 'value': 'some statement', 'children': None},
                    {'id': 3, 'value': 'some statement', 'children': None},
                ],
            },
            {
                'id': 4,
                'value': 'or',
                'children': [
                    {'id': 5, 'value': 'some statement', 'children': None},
                    {'id': 6, 'value': 'some statement', 'children': None},
                ],
            },
        ],
    }
}

Python相关问答推荐

X射线扫描显示Docker中的pip漏洞,尽管图像中未安装pip

回归回溯-2D数组中的单词搜索

已安装' owiener ' Python模块,但在导入过程中始终没有名为owiener的模块

如何在telegram 机器人中发送音频?

为什么我的(工作)代码(生成交互式情节)在将其放入函数中时不再工作?

强制venv在bin而不是收件箱文件夹中创建虚拟环境

是pandas.DataFrame使用方法查询后仍然排序吗?

查找下一个值=实际值加上使用极点的50%

实现的差异取决于计算出的表达是直接返回还是首先存储在变量中然后返回

使用Ubuntu、Python和Weasyprint的Docker文件-venv的问题

将DF中的名称与另一DF拆分并匹配并返回匹配的公司

从webhook中的短代码(而不是电话号码)接收Twilio消息

Django mysql图标不适用于小 case

处理(潜在)不断增长的任务队列的并行/并行方法

查找两极rame中组之间的所有差异

numpy卷积与有效

CommandeError:模块numba没有属性generated_jit''''

Pandas Data Wrangling/Dataframe Assignment

基于另一列的GROUP-BY聚合将列添加到Polars LazyFrame

为什么调用函数的值和次数不同,递归在代码中是如何工作的?