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

python - Python 有没有树形递归的快捷方法?

景元徽
2023-08-27
  • python 有系统内置的包或者函数能做到么?
[    {"id": 1, "name": "sql", "fid": 0},    {"id": 2, "name": "sql", "fid": 1},    {"id": 3, "name": "sql", "fid": 0},    {"id": 4, "name": "sql", "fid": 3},]
[    {"id": 1, "name": "sql", "fid": 0, "children": [{"id": 2, "name": "sql", "fid": 1}]},    {"id": 3, "name": "sql", "fid": 0, "children": [{"id": 4, "name": "sql", "fid": 3}]},]

共有2个答案

戚成礼
2023-08-27

你想要将一个扁平的 JSON 结构转换成带有嵌套的结构,其中父子关系通过 fid 字段来建立。你可以使用Python来完成这个转换过程,没有直接的内置函数可以做到,但可以通过遍历和构建的方法来实现。

以下是一个示例的Python代码,用于将给定的扁平JSON结构转换为嵌套结构:

flat_data = [    {"id": 1, "name": "sql", "fid": 0},    {"id": 2, "name": "sql", "fid": 1},    {"id": 3, "name": "sql", "fid": 0},    {"id": 4, "name": "sql", "fid": 3},]nested_data = []id_to_item = {}for item in flat_data:    item["children"] = []    id_to_item[item["id"]] = item        if item["fid"] == 0:        nested_data.append(item)    else:        parent = id_to_item.get(item["fid"])        if parent is not None:            parent["children"].append(item)print(nested_data)

在这个代码中,我们首先创建一个空的 nested_data 列表,然后使用 id_to_item 字典来跟踪每个项的父项。我们遍历 flat_data 中的每个项,将其 children 字段初始化为空列表,并将项添加到 id_to_item 字典中。然后,根据 fid 字段判断该项是否是根项(fid 为 0)或是某个父项的子项,然后将其添加到相应的位置。

这样,你就可以实现将扁平JSON结构转换为嵌套结构的操作。如果你还有其他问题,请随时提问!

曾嘉祯
2023-08-27

内置函数我目前没见过,不过数据结构算法是可以实现的,写了一个你参考下:

def build_tree(data, root_id=0):    tree = []    for item in data:        if item['fid'] == root_id:            children = build_tree(data, item['id'])            if children:                item['children'] = children            tree.append(item)    return treedata = [    {"id": 1, "name": "sql", "fid": 0},    {"id": 2, "name": "sql", "fid": 1},    {"id": 3, "name": "sql", "fid": 0},    {"id": 4, "name": "sql", "fid": 3},]tree = build_tree(data)print(tree)

我大概解释一下,build_tree是一个递归函数,它接收一个数据列表和一个根节点ID作为参数。在每次递归调用中,它遍历数据列表,找到与当前节点ID匹配的子节点,并将其加入到当前节点的子节点列表中。递归终止条件是没有匹配的子节点。最终,函数返回树形结构。

通过调用build_tree函数将给定数据转换为树形结构,你可以按需修改代码以适应你的实际需求。

 类似资料:
  • 我试图在Python中做一个函数,它接受树的任意节点,并根据节点给出的列表填充列表。 考虑到以下绘制糟糕的树: 例如,如果我们从节点5开始,我们应该得到: 包含具有相同父节点的所有节点的列表,包括我们从(4和5)开始的节点。 任何子节点,但不是其子节点(6) 父节点和具有相同父节点的任何父节点,以及它们的父节点,等等,直到我们到达根节点,但不包括根节点(在本例中只有2和3个,但如果树更深,我们开始

  • 我试图用python写一个递归函数,给定一个二叉树,一个节点返回一个包含节点方向的字符串。我已经接近了,但是我的最终返回语句给了我路径和节点(我不需要节点)即LRLR4。 这是我到目前为止的代码: 有没有一种方法可以在不使用字符串输出末尾的节点的情况下实现这一点? 编辑:添加了所有实际代码,并且有问题的树包含每个节点的单个字母字符串。

  • 问题:我想不出根据我的具体情况制作递归函数的方法。 情况: 其中向切换类别显示这是子类别。 HTML应该是什么样子的: 我需要什么样的PHP函数来打印出来?

  • 问题内容: “编写一个递归函数“ listSum”,该函数接受一个整数列表并返回列表中所有整数的和。” 例: 我知道如何以其他方式执行此操作,但不是以递归方式执行。 我需要执行此操作的基本方法,因为不允许使用特殊的内置函数。 问题答案: 每当遇到这样的问题时,请尝试使用相同的函数表示该函数的结果。 在你的情况下,你可以通过将第一个数字与在列表中其余元素上调用同一函数的结果相加来获得结果。 例如,

  • 问题内容: Python具有最大的递归深度,但没有最大的迭代深度。为什么限制递归?像迭代一样对待递归而不限制递归调用的数量会更自然吗? 让我只说这个问题的根源在于尝试实现流。例如,假设我们要编写一个流以产生自然数: 流的递归定义非常吸引人。但是,我想更好/更多的pythonic方法是使用生成器。 问题答案: 实际上这里有一些问题。 首先,正如NPE的回答很好地说明的那样,Python不会消除尾部调

  • 本文向大家介绍python递归删除指定目录及其所有内容的方法,包括了python递归删除指定目录及其所有内容的方法的使用技巧和注意事项,需要的朋友参考一下 实例如下: 以上这篇python递归删除指定目录及其所有内容的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。