簡體   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