首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python: dict数据结构的树形实现

Python: dict数据结构的树形实现
EN

Stack Overflow用户
提问于 2013-06-14 19:57:59
回答 5查看 26.9K关注 0票数 5

我有一个类似于这个dict对象,

代码语言:javascript
复制
topo = {
'name' : 'm0',
'children' : [{
    'name' : 'm1',
    'children' : []
 }, {
    'name' : 'm2',
    'children' : []
 }, {
    'name' : 'm3',
    'children' : []
 }]
}

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

代码语言:javascript
复制
{
'name' : 'ABC',
'children' : []
}

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

你能建议我该怎么做吗?

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-06-15 01:26:28

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

代码语言:javascript
复制
topo = {
  'm0' : {
    'm1' : {},
    'm2' : {},
    'm3' : {},
  },
}

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

现在,您不需要预先假定找到m2的索引位置。您确实需要知道m2在m0内部,但是您可以简单地说

代码语言:javascript
复制
topo['m0']['m2']['ABC'] = {}

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

代码语言:javascript
复制
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]

像这样叫他们

代码语言:javascript
复制
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

我假设你拥有的格式是某种文件格式的直接解释。您可以以这种方式读取它,对其进行转换,以紧凑格式使用它,然后在需要再次将其写出到文件时将其转换回来。

票数 9
EN

Stack Overflow用户

发布于 2013-06-14 20:18:21

你的问题是一个常见的树结构,你可以考虑使用http://pythonhosted.org/ete2/tutorial/tutorial_trees.html并用你的dict值填充每个节点(不要重复发明轮子)。

票数 3
EN

Stack Overflow用户

发布于 2013-06-14 20:02:37

像往常一样,使用.append()将其添加到字典中

代码语言:javascript
复制
topo['children'][1]['children'].append({'name' : 'ABC', 'children' : []})

topo现在是:

代码语言:javascript
复制
{
  "name": "m0", 
  "children": [
    {
      "name": "m1", 
      "children": []
    }, 
    {
      "name": "m2", 
      "children": [
        {
          "name": "ABC", 
          "children": []
        }
      ]
    }, 
    {
      "name": "m3", 
      "children": []
    }
  ]
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17107973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档