动态生成字典键

2024-03-29 12:15:22 发布

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

使用深度嵌套的python dict,我希望能够在这样的数据结构中分配值,如下所示:

  mydict[key][subkey][subkey2]="value"

无需检查mydict[key]等是否实际设置为dict,例如使用

  if not key in mydict: mydict[key]={}

创建子字典应该是动态的。什么是最优雅的方法来允许类似的东西-也许在标准的<type 'dict'>上使用decorator?


Tags: 方法keyin数据结构标准if字典value
3条回答
class D(dict):
    def __missing__(self, key):
        self[key] = D()
        return self[key]

d = D()
d['a']['b']['c'] = 3

你可以使用一个元组作为dict的键,然后你完全不必担心子字典:

mydict[(key,subkey,subkey2)] = "value"

或者,如果出于某种原因您真的需要子目录,那么可以使用^{}

对于两个级别,这很简单:

>>> from collections import defaultdict
>>> d = defaultdict(dict)
>>> d['key']['subkey'] = 'value'
>>> d['key']['subkey']
'value'

对三个人来说,情况稍微复杂一点:

>>> d = defaultdict(lambda: defaultdict(dict))
>>> d['key']['subkey']['subkey2'] = 'value'
>>> d['key']['subkey']['subkey2']
'value'

四个或更多的级别留给读者作为练习。:-)

我更喜欢戴夫的回答,但这里有个选择。

from collections import defaultdict
d = defaultdict(lambda : defaultdict(int))
>>> d['a']['b'] += 1
>>> d
defaultdict(<function <lambda> at 0x652f0>, {'a': defaultdict(<type 'int'>, {'b': 1})})
>>> d['a']['b']
1

http://tumble.philadams.net/post/85269428/python-nested-defaultdicts

必须使用lambdas来实现内部默认的集合,这当然不太好,但显然是必要的。

相关问题 更多 >