动态生成字典键
在处理层次很深的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