class D(dict):
def __missing__(self, key):
self[key] = D()
return self[key]
d = D()
d['a']['b']['c'] = 3
Вы можете использовать кортеж в качестве ключа для словаря, и тогда вам вообще не придется беспокоиться о субсловарях:
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'
Четыре и более уровней оставлены в качестве упражнения для читателя. : -)
Мне больше нравится ответ Дейва, но вот альтернатива.
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
Это определенно некрасиво, когда приходится использовать лямбды для реализации внутренних дефолтных коллекций, но, видимо, необходимо.