即时生成字典键

时间:2010-08-04 11:34:23

标签: python dictionary decorator

使用深层嵌套的python dicts,我希望能够在这样的数据结构中分配值:

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

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

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

子项目的创建应该在飞行中发生。允许等价物的最优雅方式是什么 - 可能在标准<type 'dict'>上使用装饰器?

3 个答案:

答案 0 :(得分:22)

class D(dict):
    def __missing__(self, key):
        self[key] = D()
        return self[key]

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

答案 1 :(得分:11)

你可以使用一个元组作为dict的关键,然后你根本不必担心子命令:

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

或者,如果您出于某种原因确实需要子分区,则可以使用collections.defaultdict

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

>>> 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'

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

答案 2 :(得分:2)

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

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来实现内部默认集合绝对不是很好,但显然是必要的。