繁体   English   中英

Python /物化路径:从平面列表递归创建嵌套字典

[英]Python/ materialized paths: recursively create nested dict from flat list

我正在尝试从mongodb的包含路径字符串的字典的平坦列表中创建嵌套的dict结构,以构建将在d3中显示的树。 例如,这是一组示例数据:

[
      { "_id" : 1, "name" : "var", "path" : "/" },
      { "_id" : 2, "name" : "var", "path" : "/var/" },
      { "_id" : 3, "name" : "log", "path" : "/var/var/" },
      { "_id" : 4, "name" : "log2", "path" : "/var/var/" },
      { "_id" : 5, "name" : "uwsgi", "path" : "/var/var/log/" },
      { "_id" : 6, "name" : "nginx", "path" : "/var/var/log2/" },
      { "_id" : 7, "name" : "error", "path" : "/var/var/log2/nginx/" },
      { "_id" : 8, "name" : "access", "path" : "/var/var/log2/nginx/" }
    ]

我需要将数据转换为具有名称属性和子项列表的这种节点格式,以使图表显示

{
       'name': 'var', 
       '_id': 1, 
       'children': [
          {
            'name': 'var'
            '_id': 2
            'children': [
              {
                 '_id': 3
                 'name': 'log', 
                 'children': [
                    {
                      '_id':5, 
                      'name': 'uwsgi', 
                      'children': []
                    }
                 ]
              }, 
              {
                 '_id': 4
                 'name': 'log2', 
                 'children': [
                    {
                      '_id': 6, 
                      'name': 'nginx', 
                      'children': [
                        {
                          '_id': 7, 
                          'name': 'error', 
                          'children': []
                        }, 
                        {
                          '_id': 8, 
                          'name', 'access', 
                          'children': []
                        }
                      ]
                    }
                 ]
              }
            ]
          }  
       ]
    }

我尝试了类似的方法,但是没有用:

def insert_node(d, res):
        if not res.get("children"):
            res["children"] = []
        if d["path"] == res["path"]:
            res["children"].append(d)
        else:
            for c in res["children"]:
                insert_node(d, c)

    root = nodes[0]
    for node in nodes[1:]
        insert_node(node, root)

是否有经典的递归方法来填充嵌套的dict结构?

可能会解决吗?

def insert_node(d, res):
    if not res.get("children"):
        res["children"] = []
    if d["path"] == res["path"]+res['name']+'/':
        res["children"].append(d)
    else:
        for c in res["children"]:
            insert_node(d, c)

root = nodes[0]
for node in nodes[1:]
    insert_node(node, root)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM