动态生成字典键

12 投票
3 回答
11721 浏览
提问于 2025-04-16 02:17

在处理层次很深的Python字典时,我希望能够像这样给这个数据结构赋值:

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

而不需要检查我的mydict[key]等是否真的被设置为字典,比如使用

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

子字典的创建应该是动态进行的。有没有什么优雅的方法可以实现类似的功能——也许可以在标准的<type 'dict'>上使用装饰器?

3 个回答

3

我更喜欢Dave的回答,不过这里有一个不同的选择。

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

虽然用lambda函数来实现里面的默认集合看起来不太好,但似乎是必须的。

14

你可以用一个元组作为字典的键,这样就不需要担心子字典的问题了:

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'

四层及以上的就留给读者自己去练习了。:-)

28

在编程中,有时候我们会遇到一些问题,比如代码运行不正常或者出现错误。这些问题可能是因为我们写的代码有bug,或者是因为我们使用的工具和环境不兼容。解决这些问题通常需要我们仔细检查代码,看看哪里出了问题。

如果你在网上找不到答案,可以考虑向社区求助,比如在StackOverflow上提问。在提问时,记得把你的代码和错误信息都贴上,这样别人才能更好地理解你的问题,给出有效的建议。

总之,遇到问题时不要着急,慢慢分析,寻找解决方案,或者向他人请教,都是很好的方法。

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

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

撰写回答