Управление структурами данных в 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": [] } ] } ] } ] } ]