首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有可变深度的多级默认判决?

具有可变深度的多级默认判决?
EN

Stack Overflow用户
提问于 2011-03-21 00:20:01
回答 9查看 39.7K关注 0票数 76

我有一个很大的列表,比如:

代码语言:javascript
复制
[A][B1][C1]=1
[A][B1][C2]=2
[A][B2]=3
[D][E][F][G]=4

我想构建一个多层次的字典,如下所示:

代码语言:javascript
复制
A
--B1
-----C1=1
-----C2=1
--B2=3
D
--E
----F
------G=4

我知道如果我使用递归的defaultdict,我可以写

table[A][B1][C1]=1, table[A][B2]=2,

但是只有当我硬编码那些insert语句时,这才能起作用。

在解析列表时,我不知道需要预先调用多少个[]

table[key1][key2][...].

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2012-01-02 23:18:34

你甚至不需要定义一个类就可以做到这一点:

代码语言:javascript
复制
from collections import defaultdict

nested_dict = lambda: defaultdict(nested_dict)
nest = nested_dict()

nest[0][1][2][3][4][5] = 6
票数 192
EN

Stack Overflow用户

发布于 2011-03-21 00:37:14

您的示例说明,在任何级别上都可以有一个值,也可以有一个子元素字典。这就是所谓的树,并且有许多可用于它们的实现。这是其中之一:

代码语言:javascript
复制
from collections import defaultdict
class Tree(defaultdict):
    def __init__(self, value=None):
        super(Tree, self).__init__(Tree)
        self.value = value

root = Tree()
root.value = 1
root['a']['b'].value = 3
print root.value
print root['a']['b'].value
print root['c']['d']['f'].value

输出:

代码语言:javascript
复制
1
3
None

您可以通过用JSON编写输入并使用 json.load 将其读作嵌套字典的结构。

票数 18
EN

Stack Overflow用户

发布于 2012-12-16 19:49:57

我认为递归字典最简单的实现是这样的。只有叶节点可以包含值。

代码语言:javascript
复制
# Define recursive dictionary
from collections import defaultdict
tree = lambda: defaultdict(tree)

用法:

代码语言:javascript
复制
# Create instance
mydict = tree()

mydict['a'] = 1
mydict['b']['a'] = 2
mydict['c']
mydict['d']['a']['b'] = 0

# Print
import prettyprint
prettyprint.pp(mydict)

输出:

代码语言:javascript
复制
{
  "a": 1, 
  "b": {
    "a": 1
  }, 
  "c": {},
  "d": {
    "a": {
      "b": 0
    }
  }
}
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5369723

复制
相关文章

相似问题

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