Python:树类似于dict数据结构的实现

Aas*_*h P 3 python dictionary

我有类似这样的dict对象,

topo = {
'name' : 'm0',
'children' : [{
    'name' : 'm1',
    'children' : []
 }, {
    'name' : 'm2',
    'children' : []
 }, {
    'name' : 'm3',
    'children' : []
 }]
}
Run Code Online (Sandbox Code Playgroud)

现在,我想再插入一个dict对象,比如说,

{
'name' : 'ABC',
'children' : []
}
Run Code Online (Sandbox Code Playgroud)

作为在m2的儿童阵列中名为"m2"的dict的孩子.

你能建议我该怎么办?

我应该采用单独的数据结构实现吗?

mor*_*tar 7

我建议你先把它转换成这样的数据结构:

topo = {
  'm0' : {
    'm1' : {},
    'm2' : {},
    'm3' : {},
  },
}
Run Code Online (Sandbox Code Playgroud)

也就是说,您已将'name'键的每个值都设置为字典中的键,并且'children'键的每个值都是该键的值,并将其更改为字典而不是列表.

现在您不需要事先假设找到m2的索引位置.你需要知道m2在m0内,但你可以简单地说

topo['m0']['m2']['ABC'] = {}
Run Code Online (Sandbox Code Playgroud)

您可以使用以下代码在格式之间进行转换

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]
Run Code Online (Sandbox Code Playgroud)

像这样打电话给他们

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
Run Code Online (Sandbox Code Playgroud)

我假设你的格式是某些文件格式的直接解释.您可以通过这种方式阅读,转换它,以紧凑格式使用它,然后在需要再次将其写入文件时将其转换回来.