Python - 动态构建嵌套树

标签 python json algorithm recursion tree

我正在尝试用 python 构建一个树层次结构让我说我有他的结构,我需要能够动态地添加更多的 child 到例如 Bannana。 我觉得我的问题有点不清楚

更新:我需要创建一个这样的结构,但是值会改变所以我需要创建函数来传递一个 int 并创建那个数量的 Apple(Children) 并为 Lemon 和所有其他 child 做同样的事情。苹果节点也是根节点。

Apple
   Bannana
   Lemon
      Juice
        Drink
   Watermelon
       Red
         Round

但是我可以有一个完全不同的结构,例如

Apple
   Bannana
   Lemon
      Juice
        Drink
          Watermelon
       Red
          Round

Json 输出将是

{
    'Apple': 'Fruit',
    'children': [{
        'Bannana': 'fruit',
        'children': None
    },  {
        'Lemon': 'Fruit',
        'children': [{
            'Juice': 'Food',
            'children': [{
                'Drink': 'Action',
                'children': None
             And so on...

如何使层次结构动态化?例如特定父项下的行数?

我已经从我找到的一个例子中尝试过类似的东西

import collections
def add_element(root, path, data):
    if len(path) == 1:
        root[path[0]] = data
    else:
        add_element(root[path[0]], path[1:], data)

count = 1


tree = lambda: collections.defaultdict(tree)
root = tree()
n= 10
for i in range(1,n):
    path_list= ['Apple', 'Lemon', 'Juice' + str(count)]
    print (path_list)
    count += 1
    add_element(root,path_list, 1 )
print (root)

编辑 1

根据答案我对代码做了一些修改

args = {'Apple': 'Apple', 'Lemon': 'Lemon', 'Juice': 'Juice', 'Drink': 'Drink'}

s = """
{Apple}
   {Lemon}
      {Juice}
         {Drink}
""".format(**args)

def group_data(vals):
  if len(vals) == 1:
     return {vals[0]:'Fruit', 'Children':None}
  new_data = [list(b) for _, b in itertools.groupby(vals, key=lambda x:bool(re.findall('^\s', x)))]
  new_group = [[new_data[i], new_data[i+1]] for i in range(0, len(new_data), 2)]
  result = []
  for a, b in new_group:
     result.extend([{i:'Fruit', 'Children':None} for i in a[:-1]])
     result.append({a[-1]:'Fruit', 'Children':group_data([re.sub('^\s{3}', '', c) for c in b])})
  return result

_new_data = [i.strip('\n') for i in filter(None, s.split('\n'))]


print(json.dumps(group_data(_new_data), indent=4))

这工作正常,但它仍然是硬编码的,这不是我想要的。

最佳答案

你可以分析每个水果前的空格:

s = """
Apple
   Bannana
   Lemon
      Juice
         Drink
            Watermelon
      Red
         Round
"""

import itertools, re
def group_data(vals):
  if len(vals) == 1:
     return {vals[0]:'Fruit', 'Children':None}
  new_data = [list(b) for _, b in itertools.groupby(vals, key=lambda x:bool(re.findall('^\s', x)))]
  new_group = [[new_data[i], new_data[i+1]] for i in range(0, len(new_data), 2)]
  result = []
  for a, b in new_group:
     result.extend([{i:'Fruit', 'Children':None} for i in a[:-1]])
     result.append({a[-1]:'Fruit', 'Children':group_data([re.sub('^\s{3}', '', c) for c in b])})
  return result

_new_data = [i.strip('\n') for i in filter(None, s.split('\n'))]

import json
print(json.dumps(group_data(_new_data), indent=4))

输出:

[
     {
       "Apple": "Fruit",
       "Children": [
         {
            "Bannana": "Fruit",
            "Children": null
           },
           {
               "Lemon": "Fruit",
               "Children": [
                  {
                      "Juice": "Fruit",
                       "Children": [
                            {
                             "Drink": "Fruit",
                             "Children": {
                                 "Watermelon": "Fruit",
                                 "Children": null
                              }
                          }
                      ]
                  },
                  {
                       "Red": "Fruit",
                       "Children": {
                          "Round": "Fruit",
                          "Children": null
                     }
                  }
              ]
          }
       ]
    }
]

关于Python - 动态构建嵌套树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53503656/

相关文章:

javascript - Bottlepy - 如何从 javascript 访问 Bottle 参数 {{var}}?

javascript - 如何访问此 json 对象中的 'img'? PHP,Laravel-5

javascript - 处理获取ajax json请求的php

algorithm - 一种算法的时间复杂度级联到另一种算法?

python - 在 Python 中创建 headless Chrome 实例

python - 服务 attention_ocr 模型时出错 ("error": "Expected one or two output Tensors, found 17")

python - 将 PIL/PILLOW 图像复制到 Windows 剪贴板

php - 使用 httpclient 从 webservice 读取

c - 为什么我的 PRIME1 - SPOJ 实现会收到 SIGSEGV,即使它在我的电脑中的所有测试用例中运行良好?

algorithm - 通知网络所有节点的最短时间