我的dict对象与此类似,
topo = {
'name' : 'm0',
'children' : [{
'name' : 'm1',
'children' : []
}, {
'name' : 'm2',
'children' : []
}, {
'name' : 'm3',
'children' : []
}]
}
现在,我想再插入一个dict对象,比如说,
{
'name' : 'ABC',
'children' : []
}
作为dict的孩子,在m2的子阵列中名为“m2”。
请问您应该怎么做呢?
我应该采用单独的数据结构实现吗?
答案 0 :(得分:6)
我建议你先把它转换成这样的数据结构:
topo = {
'm0' : {
'm1' : {},
'm2' : {},
'm3' : {},
},
}
也就是说,您已将'name'键的每个值都设置为字典中的键,并且'children'键的每个值都是该键的值,并将其更改为字典而不是列表
现在您不需要事先假设找到m2的索引位置。你需要知道m2在m0之内,但你可以简单地说
topo['m0']['m2']['ABC'] = {}
您可以使用以下代码转换格式:
def verbose_to_compact(verbose):
return { item['name']: verbose_to_compact(item['children']) for item in verbose }
def compact_to_verbose(compact):
return [{'name':key, 'children':compact_to_verbose(value)} for key, value in compact]
像这样打电话给他们
compact_topo = verbose_to_compact([topo]) # function expects list; make one-item list
verbose_topo = compact_to_verbose(compact_topo)[0] # function returns list; extract the single item
我假设您拥有的格式是某种文件格式的直接解释。您可以通过这种方式阅读,转换它,以紧凑格式使用它,然后在需要将其再次写入文件时将其转换回来。
答案 1 :(得分:3)
您的问题是常见的树结构,您可以考虑使用http://pythonhosted.org/ete2/tutorial/tutorial_trees.html并使用您的dict值填充每个节点(不要重新发明轮子)。
答案 2 :(得分:1)
使用.append()
:
topo['children'][1]['children'].append({'name' : 'ABC', 'children' : []})
topo
现在是:
{
"name": "m0",
"children": [
{
"name": "m1",
"children": []
},
{
"name": "m2",
"children": [
{
"name": "ABC",
"children": []
}
]
},
{
"name": "m3",
"children": []
}
]
}
答案 3 :(得分:1)
topo['children'][1]['children'].append({'name': 'ABC', 'children': []})
这会在topo的第二个孩子的子项下添加新词典:
{'children': [{'children': [], 'name': 'm1'},
{'children': [{'children': [], 'name': 'ABC'}], 'name': 'm2'},
{'children': [], 'name': 'm2'}],
'name': 'm0'}
但我不会使用dict并列出内置对象来执行这样的任务 - 我宁愿创建自己的对象。
答案 4 :(得分:0)
topo['children'].append({'name' : 'ABC',
'children' : []
})