代码之家  ›  专栏  ›  技术社区  ›  max

是否从路径列表转换为Flare json格式?

  •  2
  • max  · 技术社区  · 7 年前

    python中的数据如下所示:

    [['a', 'b', 'c', 50],
     ['a', 'b', 'd', 100],
     ['a', 'b', 'e', 67],
     ['a', 'g', 'c', 12],
     ['q', 'k', 'c', 11],
     ['q', 'b', 'p', 11]]
    

    其中列表的每个元素都是一个完整的层次路径,最后一个元素是路径的大小。要在D3中进行可视化,我需要数据采用flare数据格式-如图所示:

    https://github.com/d3/d3-hierarchy/blob/master/test/data/flare.json

    {
     "name": "root",
     "children": [
      {
       "name": "a",
       "children": [
        {
         "name": "b",
         "children": [
          {"name": "c", "value": 50},
          {"name": "d", "value": 100},
          {"name": "e", "value": 67},
         ]
        },
        {
         "name": "g",
         "children": [
          {"name": "c", "value": 12},
         ]
        },
    

    等等。。。

    json 一个Python字典上的库,但我似乎无法让它工作。非常感谢您的帮助。

    3 回复  |  直到 7 年前
        1
  •  1
  •   C. Braun    7 年前

    下面是一个使用递归的解决方案:

     def add_to_flare(n, flare):
         children = flare["children"]
    
         if len(n) == 2:
             children.append({"name": n[0], "value": n[1]})
         else:
             for c in children:
                 if c["name"] == n[0]:
                     add_to_flare(n[1:], c)
                     return
    
             children.append({"name": n[0], "children": []})
             add_to_flare(n[1:], children[-1])
    
     flare = {"name": "root", "children": []} 
    
     for i in data:
         add_to_flare(i, flare)
    

    为了更好地展示它,我们可以使用 json 图书馆:

    import json
    print(json.dumps(flare, indent=1))
    
    {
     "name": "root", 
     "children": [
      {
       "name": "a", 
       "children": [
        {
         "name": "b", 
         "children": [
          {
           "name": "c", 
           "value": 50
          }, 
          {
           "name": "d", 
           "value": 100
          }, 
          {
           "name": "e", 
           "value": 67
          }
         ]
        }, 
        {
         "name": "g", 
         "children": [
          {
           "name": "c", 
           "value": 12
          }
         ]
        }
       ]
      }, 
      {
       "name": "q", 
       "children": [
        {
         "name": "k", 
         "children": [
          {
           "name": "c", 
           "value": 11
          }
         ]
        }, 
        {
         "name": "b", 
         "children": [
          {
           "name": "p", 
           "value": 11
          }
         ]
        }
       ]
      }
     ]
    }
    
        2
  •  0
  •   Rocky Li    7 年前

    master = []
    for each in your_list:
        head = master
        for i in range(len(each)):
            names = [e['name'] for e in head]
            if i == len(each) - 2:
                head.append({'name': each[i], 'value': each[i+1]})
                break
            if each[i] in names:
                head = head[names.index(each[i])]['children']
            else:
                head.append({'name': each[i], 'children': []})
                head = head[-1]['children']
    

    结果:

    [{'children': [{'children': [{'name': 'c', 'value': 50},
                                 {'name': 'd', 'value': 100},
                                 {'name': 'e', 'value': 67}],
                    'name': 'b'},
                   {'children': [{'name': 'c', 'value': 12}], 'name': 'g'}],
      'name': 'a'},
     {'children': [{'children': [{'name': 'c', 'value': 11}], 'name': 'k'},
                   {'children': [{'name': 'p', 'value': 11}], 'name': 'b'}],
      'name': 'q'}]
    

    请注意 name 和 children 因为这本字典没有顺序,所以翻了一遍。但最终的结构是一样的。

    把它放在根上以获得你的目标:

    my_dict = {'name':'root', 'children': master}
    
        3
  •  0
  •   blhsing    7 年前

    l ,您可以执行以下操作:

    o = []
    for s in l:
        c = o
        for i, n in enumerate(['root'] + s[:-1]):
            for d in c:
                if n == d['name']:
                    break
            else:
                c.append({'name': n})
                d = c[-1]
            if i < len(s) - 1:
                if 'children' not in d:
                    d['children'] = []
                c = d['children']
            else:
                d['value'] = s[-1]
    

    o[0]

    {'children': [{'children': [{'children': [{'name': 'c', 'value': 50},
                                              {'name': 'd', 'value': 100},
                                              {'name': 'e', 'value': 67}],
                                 'name': 'b'},
                                {'children': [{'name': 'c', 'value': 12}],
                                 'name': 'g'}],
                   'name': 'a'},
                  {'children': [{'children': [{'name': 'c', 'value': 11}],
                                 'name': 'k'},
                                {'children': [{'name': 'p', 'value': 11}],
                                 'name': 'b'}],
                   'name': 'q'}],
     'name': 'root'}