Python:dict datastructu的树状实现

2024-05-28 20:34:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个类似的dict对象

topo = {
'name' : 'm0',
'children' : [{
    'name' : 'm1',
    'children' : []
 }, {
    'name' : 'm2',
    'children' : []
 }, {
    'name' : 'm3',
    'children' : []
 }]
}

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

{
'name' : 'ABC',
'children' : []
}

在m2的子数组中作为名为“m2”的dict的子数组。

你能建议我怎么做吗?

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


Tags: 对象name数据结构数组建议dictm3abc
3条回答

我建议您首先将其转换为如下数据结构:

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

我假设你的格式是对某些文件格式的直接解释。您可以用这种方式读取它,转换它,以压缩格式使用它,然后在需要再次将其写入文件时将其转换回。

您的问题是一个常见的树结构,您可以考虑使用http://pythonhosted.org/ete2/tutorial/tutorial_trees.html,并用dict值填充每个节点(不要重新创建控制盘)。

使用.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": []
    }
  ]
}

相关问题 更多 >

    热门问题