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

时间:2018-11-02 17:27:24

标签: python json recursion

我在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中进行可视化处理,我需要数据采用耀斑数据格式-见此处:

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},
     ]
    },

等等...

从我一直在寻找的角度来看,我认为该解决方案是递归的,并且可以在Python字典上使用json库,但是我似乎无法使其正常工作。任何帮助是极大的赞赏。

3 个答案:

答案 0 :(得分:1)

这是使用递归的解决方案:

 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
      }
     ]
    }
   ]
  }
 ]
}

答案 1 :(得分:0)

尝试一下:

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'}]

请注意,namechildren在此字典中是无序的,因此会被翻转。但是结果结构是相同的。

将其扎根以获得目标:

my_dict = {'name':'root', 'children': master}

答案 2 :(得分:0)

假设列表列表存储在变量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'}