在处理深度嵌套的Python字典时,我希望能够像这样对这样的数据结构进行赋值:
mydict[key][subkey][subkey2]="value"
不需要检查mydict[key]是否设置为字典,例如使用
if not key in mydict: mydict[key]={}
创建子字典应该是动态的。有什么优雅的方法可以实现类似的功能吗?也许可以在标准 <type 'dict'>
上使用装饰器?在处理深度嵌套的Python字典时,我希望能够像这样对这样的数据结构进行赋值:
mydict[key][subkey][subkey2]="value"
不需要检查mydict[key]是否设置为字典,例如使用
if not key in mydict: mydict[key]={}
创建子字典应该是动态的。有什么优雅的方法可以实现类似的功能吗?也许可以在标准 <type 'dict'>
上使用装饰器?class D(dict):
def __missing__(self, key):
self[key] = D()
return self[key]
d = D()
d['a']['b']['c'] = 3
d['a'] = 2 d['a']['b'] = 2
这段代码会失败。 - unholysamplerdef __getitem__(self, key):
values = dict.__getitem__(self, key)
if isinstance(values, dict):
values = SafeDict(values)
if isinstance(values, list):
for i, v in enumerate(values):
if isinstance(v, dict):
values[i] = SafeDict(v)
return values
- user2346922你可以使用元组作为字典的键,这样你就不必担心子字典了:
mydict[(key,subkey,subkey2)] = "value"
如果出于某种原因您确实需要使用子字典,可以考虑使用collections.defaultdict
。
对于两个级别的情况,这很简单:
>>> from collections import defaultdict
>>> d = defaultdict(dict)
>>> d['key']['subkey'] = 'value'
>>> d['key']['subkey']
'value'
对于3个元素,稍微复杂一些:
>>> d = defaultdict(lambda: defaultdict(dict))
>>> d['key']['subkey']['subkey2'] = 'value'
>>> d['key']['subkey']['subkey2']
'value'
四个及以上的级别留给读者作为练习。 :-)
defaultdict
的方法吗?嵌套一次很容易:mydict = defaultdict(dict)
。但是有没有更优雅的解决方案可以嵌套两次? - Johannes Charradefaultdict
解决方案。 - David Webbfrom 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函数确实不太美观,但显然是必要的。
repr
比lambda
更有意义些。 - Duncan