在Python中操作数据结构
我有JSON格式的数据:在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
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])但是它对数据进行了重新排序。tryjson.dumps(convert(data)[0])
@ono别忘了给mata的答案投赞成票,尤其是因为他也回答了你所有的其他问题。完美!但不能导入或定向添加。必须找到解决办法。@ono-我只是使用OrderedDict,所以元素的顺序保持不变,但这并不重要,只要使用dict()
相反。最后一个问题:如何删除初始括号“[”?如果它们在那里,它将不会绘制。我尝试了第一个元素(数据[0]),但它重新排序了数据。尝试json.dumps(convert(data)[0])
@ono不要忘记对mata的答案投赞成票,尤其是因为他也回答了你所有其他的问题