在Python中操作数据结构

在Python中操作数据结构,python,data-structures,dictionary,infovis,Python,Data Structures,Dictionary,Infovis,我有JSON格式的数据: data = {"outfit":{"shirt":"red,"pants":{"jeans":"blue","trousers":"khaki"}}} 我正试图使用InfoVis将这些数据绘制成一个决策树,因为它看起来很漂亮,而且具有交互性。问题在于他们的图形采用以下格式的JSON数据: data = {id:"nodeOutfit", name:"outfit", data:{}, children:[{ id:"nodeS

我有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
如果我走远了,请告诉我

这是他们的例子


下面是数据

一个简单的递归解决方案:

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
返回一个
列表,而不是
dict
,因为
数据
也可能有多个键,而只返回
装备

输出:

[ { "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”:“nodeOutfit”, “姓名”:“服装”, “数据”:{}, “儿童”:[ { “id”:“nodeShirt”, “姓名”:“衬衫”, “数据”:{}, “儿童”:[ { “id”:“nodeRed”, “名称”:“红色”, “数据”:{}, “儿童”:[] } ] }, { “id”:“节点组件”, “姓名”:“裤子”, “数据”:{}, “儿童”:[ { “id”:“nodeJeans”, “姓名”:“牛仔裤”, “数据”:{}, “儿童”:[ { “id”:“nodeBlue”, “名称”:“蓝色”, “数据”:{}, “儿童”:[] } ] }, { “id”:“nodeTrousers”, “姓名”:“裤子”, “数据”:{}, “儿童”:[ { “id”:“nodeKhaki”, “名称”:“卡其色”, “数据”:{}, “儿童”:[] } ] } ] } ] } ]
一个简单的递归解决方案:

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
返回一个
列表,而不是
dict
,因为
数据
也可能有多个键,而只返回
装备

输出:

[ { "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”:“nodeOutfit”, “姓名”:“服装”, “数据”:{}, “儿童”:[ { “id”:“nodeShirt”, “姓名”:“衬衫”, “数据”:{}, “儿童”:[ { “id”:“nodeRed”, “名称”:“红色”, “数据”:{}, “儿童”:[] } ] }, { “id”:“节点组件”, “姓名”:“裤子”, “数据”:{}, “儿童”:[ { “id”:“nodeJeans”, “姓名”:“牛仔裤”, “数据”:{}, “儿童”:[ { “id”:“nodeBlue”, “名称”:“蓝色”, “数据”:{}, “儿童”:[] } ] }, { “id”:“nodeTrousers”, “姓名”:“裤子”, “数据”:{}, “儿童”:[ { “id”:“nodeKhaki”, “名称”:“卡其色”, “数据”:{}, “儿童”:[] } ] } ] } ] } ]
递归解决方案有什么问题?我现在的问题是将“装备”改为“装备”。不知道如何操作单个键/值。我仍然可以使用递归来遍历结构。当你迭代dict时,存储键并递归处理值。递归解决方案有什么问题吗?我现在的问题是将“装备”改为“装备”。不知道如何操作单个键/值。我仍然可以使用递归来遍历结构。当您在dict上迭代时,存储键并递归地处理值。太好了!但无法导入或定向添加。必须找到解决方法。@ono-我只是使用OrderedDict,以便元素的顺序保持不变,但这并不重要,只需使用
dict()
。最后一个问题:如何删除初始括号“[”?如果它们在那里,它将不会打印。我尝试了第一个元素(数据[0])但是它对数据进行了重新排序。try
json.dumps(convert(data)[0])
@ono别忘了给mata的答案投赞成票,尤其是因为他也回答了你所有的其他问题。完美!但不能导入或定向添加。必须找到解决办法。@ono-我只是使用OrderedDict,所以元素的顺序保持不变,但这并不重要,只要使用
dict()
相反。最后一个问题:如何删除初始括号“[”?如果它们在那里,它将不会绘制。我尝试了第一个元素(数据[0]),但它重新排序了数据。尝试
json.dumps(convert(data)[0])
@ono不要忘记对mata的答案投赞成票,尤其是因为他也回答了你所有其他的问题