当前位置: 首页 > 知识库问答 >
问题:

递归构建分层JSON树?

谷梁迪
2023-03-14

我有一个父子关系数据库。数据如下所示,但可以以任何方式呈现(字典、列表列表、JSON等)。

links=(("Tom","Dick"),("Dick","Harry"),("Tom","Larry"),("Bob","Leroy"),("Bob","Earl"))

我需要的输出是一个层次化的JSON树,它将用d3呈现。数据中有离散的子树,我将附加到根节点。所以我需要递归地遍历链接,并建立树结构。我最多只能遍历所有人并附加他们的孩子,但我不知道如何进行高阶链接(例如,如何将有孩子的人附加到其他人的孩子)。这类似于这里的另一个问题,但我无法提前知道根节点,因此无法实现公认的解决方案。

我将从我的示例数据中获得以下树结构。

{
"name":"Root",
"children":[
    {
     "name":"Tom",
     "children":[
         {
         "name":"Dick",
         "children":[
             {"name":"Harry"}
         ]
         },
         {
          "name":"Larry"}
     ]
    },
    {
    "name":"Bob",
    "children":[
        {
        "name":"Leroy"
        },
        {
        "name":"Earl"
        }
    ]
    }
]
}

共有3个答案

陈正业
2023-03-14

如果您想将数据格式化为HTML/JS本身的层次结构,请查看:

生成(多级)光斑。平面json的json数据格式

如果您有大量数据,Web转换将更快,因为它使用了reduce功能,而Python缺少函数编程。

顺便说一句:我也在研究同一个主题,即在d3.js.中生成可折叠的树结构。如果你想继续工作,我的电子邮件是:erprateek.vit@gmail.com。

蔡明贤
2023-03-14

尝试以下代码:

import json

links = (("Tom","Dick"),("Dick","Harry"),("Tom","Larry"),("Tom","Hurbert"),("Tom","Neil"),("Bob","Leroy"),("Bob","Earl"),("Tom","Reginald"))

name_to_node = {}
root = {'name': 'Root', 'children': []}
for parent, child in links:
    parent_node = name_to_node.get(parent)
    if not parent_node:
        name_to_node[parent] = parent_node = {'name': parent}
        root['children'].append(parent_node)
    name_to_node[child] = child_node = {'name': child}
    parent_node.setdefault('children', []).append(child_node)

print json.dumps(root, indent=4)
袁建木
2023-03-14

要识别根节点,您可以解压缩链接并查找非子节点的父节点:

parents, children = zip(*links)
root_nodes = {x for x in parents if x not in children}

然后可以应用递归方法:

import json

links = [("Tom","Dick"),("Dick","Harry"),("Tom","Larry"),("Bob","Leroy"),("Bob","Earl")]
parents, children = zip(*links)
root_nodes = {x for x in parents if x not in children}
for node in root_nodes:
    links.append(('Root', node))

def get_nodes(node):
    d = {}
    d['name'] = node
    children = get_children(node)
    if children:
        d['children'] = [get_nodes(child) for child in children]
    return d

def get_children(node):
    return [x[1] for x in links if x[0] == node]

tree = get_nodes('Root')
print json.dumps(tree, indent=4)

我使用了一个集合来获取根节点,但如果顺序很重要,则可以使用列表并删除重复项。

 类似资料:
  • 本文向大家介绍使用递归[JavaScript]创建层次结构,包括了使用递归[JavaScript]创建层次结构的使用技巧和注意事项,需要的朋友参考一下 示例 输出            

  • 问题内容: 我有一个MySQL表,如下所示: 现在,我想有一个简单的MySQL查询,只需向其提供ID [例如说id=19],然后就应该获取其所有子ID [即结果应具有ID ‘20,21,22’]…。 孩子的等级未知;它可能会有所不同.... 我知道如何使用for循环…但是如何使用单个MySQL查询实现相同的目标? 问题答案: 对于MySQL 8+:使用递归with语法。 对于MySQL 5.x:使

  • 我有一个MySQL表,如下所示: 现在,我想有一个MySQL查询,我只需向它提供id(例如),然后我应该获得它的所有子id(即,结果应该有id'20、21、22']... 不知道孩子的等级;它可以变化.... 我知道如何使用循环来实现...但是如何使用单个MySQL查询实现相同的功能呢?

  • Recurrent层 keras.layers.recurrent.Recurrent(weights=None, return_sequences=False, go_backwards=False, stateful=False, unroll=False, consume_less='cpu', input_dim=None, input_length=None) 这是递归层的抽象类,请不

  • 我在Postgres数据库中有一个分层表,例如,

  • 我有一个类似Github链接的JSON树 如您所见,此树对每个项使用属性来计算其值。所以我需要计算几个节点或根节点的值。 您可以看到PL6A,PL6B是树的末尾,其类型为。因此,我需要替换到树,这样,由构造的必须替换为。 示例:公式必须替换为(ACVALUE(PL6A)ACVALUE(PL6B))。。。 我该怎么做呢?谢谢你,对不起,英语不好 更新我已尝试此代码: 结果,一些节点运行良好 但如果我