从最后一列向动态树添加大小

阿舒托什·特里帕蒂(Ashutosh Tripathi)

我需要创建一个嵌套的dict结构,其中每个级别的孩子数量都可以变化。

在森伯斯特图中,将“ size”元素附加到最后一个json子元素上,此问题涵盖了树的创建,除了我需要从最后一列中提取大小。

给定我在各个级别之间重复的标签,并且每个级别可以与终端级别使用相同的标签“ abc”,以及下一个级别的父级-我在这里稍作修改了代码(以避免在子分支中重复)。但是,我无法指定大小,该大小存储在最后一列中,应该在每个叶子末端替换此处的1。我知道我需要将行中的值传递给递归循环build_leaf,但似乎无法弄清楚该怎么做。

样本数据

import csv
from collections import defaultdict
import json

def ctree():
    return defaultdict(ctree)


def build_leaf(name, leaf):        
    if len(name)==0:
        res={"name":"last node"}
        res['size']=1
    else:
        res = {"name": name}

        # add children node if the leaf actually has any children
        if len(leaf.keys())>0:
            res["children"] = [build_leaf(k, v) for k, v in leaf.items()]
        else:
            res['size'] = 1

    return res

def main():
    tree = ctree()
    # NOTE: you need to have test.csv file as neighbor to this file
    with open('./inpfile.csv') as csvfile:
        reader = csv.reader(csvfile)
        header = next(reader)  # read the header row        
        i=0
        for row in reader:
            # usage of python magic to construct dynamic tree structure and
            # basically grouping csv values under their parents
            leaf = tree[row[0]]
            size=row[-1]

            for value in row[1:-1]:
                leaf = leaf[value]

    # building a custom tree structure
    res = []

    for name, leaf in tree.items():
        res.append(build_leaf(name, leaf))

    # printing results into the terminal
    print(json.dumps(res, indent=2))
    with open('paths.json', 'w') as fp:
        json.dump(res, fp)


main()

提及的数据的最终输出应类似于:

[
  {
    "name": "A1",
    "children": [
      {
        "name": "A2",
        "children": [
          {
            "name": "A1",
            "children": [
              {
                "name": "A2",
                "children": [
                  {
                    "name": "A3",
                    "size": 80
                  }
                ]
              }
            ]
          },
          {
            "name": "A3",
            "children": [
              {
                "name": "A2",
                "children": [
                  {
                    "name": "A3",
                    "size": 169
                  }
                ]
              },
              {
                "name": "exit site",
                "size": 764
              }
            ]
          },
          {
            "name": "A6",
            "children": [
              {
                "name": "A3",
                "children": [
                  {
                    "name": "exit site",
                    "size": 127
                  }
                ]
              }
            ]
          },
          {
            "name": "exit site",
            "size": 576
          }
        ]
      }
    ]
  }
]
阿舒托什·特里帕蒂(Ashutosh Tripathi)

如果有人偶然发现了相同的问题-我可以通过创建另一个递归循环来从嵌套叶中检索大小来使其工作(感谢道格拉斯的帮助)。

def ctree():
    return defaultdict(ctree)

def get_size(leaf1):
    for k,v in leaf1.items():
        if k=="size":
            return v
        else:
            return get_size(v)


def build_leaf(name, leaf):

    if len(name)==0:
        res={"name":"exit site"}
        res['size']=int(get_size(leaf))

    else:
        res = {"name": name}

        # add children node if the leaf actually has any children
        if not leaf["size"]:
            res["children"] = [build_leaf(k, v) for k, v in leaf.items() if not k == "size" ]
        else:
            res['size'] = int(get_size(leaf))

    return res

def make_json(inpfile,outjson):
    tree = ctree()
    # NOTE: you need to have test.csv file as neighbor to this file
    with open("./filepath.csv") as csvfile:
        reader = csv.reader(csvfile)
        header = next(reader)  # read the header row        

        for row in reader:
            # usage of python magic to construct dynamic tree structure and
            # basically grouping csv values under their parents
            leaf = tree[row[0]]
            size=row[-1]

            for value in row[1:-1]:
                leaf = leaf[value]
            if len(row) < 6:
                leaf["exit site"]["size"]=size
            else:
                leaf["size"]=size

    # building a custom tree structure
    res = []

    for name, leaf in tree.items():
        res.append(build_leaf(name, leaf))

    with open(outjson, 'w') as fp:
        json.dump(res, fp)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章