Управление структурами данных в Python

У меня есть данные в формате JSON:

data = {"outfit":{"shirt":"red,"pants":{"jeans":"blue","trousers":"khaki"}}}

Я пытаюсь представить эти данные в дереве решений с помощью InfoVis, потому что это выглядит красиво и интерактивно. Проблема в том, что их граф принимает данные JSON в этом формате:

data = {id:"nodeOutfit",
    name:"outfit",
    data:{},
    children:[{
        id:"nodeShirt",
        name:"shirt",
        data:{},
        children:[{
            id:"nodeRed",
            name:"red",
                   data:{},
                   children:[]
        }],
     },  {
         id:"nodePants",
         name:"pants",
         data:{},
         children:[{
             id:"nodeJeans",
             name:"jeans",
             data:{},
             children:[{
                    id:"nodeBlue",
                    name:"blue",
                    data:{},
                    children[]
             },{
             id:"nodeTrousers",
             name:"trousers",
             data:{},
             children:[{
                    id:"nodeKhaki",
                    name:"khaki",
                    data:{},
                    children:[]
          }
    }

Обратите внимание на добавление "id", "data" и "children" к каждому ключу и значению и вызов каждого ключа и значения "name". Я чувствую, что мне нужно написать рекурсивную функцию, чтобы добавить эти дополнительные значения. Есть простой способ сделать это?

Вот что я хочу сделать, но я не уверен, что это правильный путь. Переберите все ключи и значения и замените их соответствующими:

for name, list in data.iteritems():
    for dict in list:
        for key, value in dict.items():
            #Need something here which changes the value for each key and values
            #Not sure about the syntax to change "outfit" to name:"outfit" as well as
            #adding id:"nodeOutfit", data:{}, and 'children' before the value

Дайте мне знать, если я далеко.

Вот их пример http://philogb.github.com/jit/static/v20/Jit/Examples/Spacetree/example1.html

А вот и данные http://philogb.github.com/jit/static/v20/Jit/Examples/Spacetree/example1.code.html

1 ответ

Решение

Простое рекурсивное решение:

data = {"outfit":{"shirt":"red","pants":{"jeans":"blue","trousers":"khaki"}}}
import json
from collections import OrderedDict

def node(name, children):
    n = OrderedDict()
    n['id'] = 'node' + name.capitalize()
    n['name'] = name
    n['data'] = {}
    n['children'] = children
    return n

def convert(d):
    if type(d) == dict:
        return [node(k, convert(v)) for k, v in d.items()]
    else:
        return [node(d, [])]

print(json.dumps(convert(data), indent=True))

Обратите внимание, что convert возвращает listне dict, как data может также иметь более одного ключа, то просто 'outfit',

выход:

[{"id": "nodeOutfit", "name": "outfit", "data": {}, "children": [{"id": "nodeShirt", "name": "shirt", "data": {}, "children": [{"id": "nodeRed", "name": "red", "data": {}, "children": []}]}, {"id": "nodePants "," имя ":" брюки "," данные ": {}," дети ": [
     {
      "id": "nodeJeans", 
      " имя ":" джинсы "," данные ": {}," дети ": [
       {
        "id": "nodeBlue", 
        "name": "blue", 
        "data": {}, 
        "children": []
       }
      ]
     }, 
     {
      "id": "nodeTrousers", 
      "name": "брюк ", 
      "data": {}, 
      "children": [
       {
        "id": "nodeKhaki", 
        "name": "khaki", 
        "data": {}, 
        "children": []
       }
      ]
     }
    ]
   }
  ]
 }
]
Другие вопросы по тегам