無限defaultdict/辞書型キー初期化

辞書を何階層にも入れ子にして、それでも各階層の初期化を自動的に行いたい場合、setdefaultを使うのであれば

d = {}
d.setdefault('key1',{}).setdefault('key2',{}).setdefault('key3',{})['key4'] = 'value'
print d['key1']['key2']['key3']['key4']

のように、ひたすらsetdefaultを連結して書くことは可能です。

defaultdictでこれを書こうとすると、こんな感じです。

from collections import defaultdict

d = defaultdict(lambda:defaultdict(lambda:defaultdict(dict)))
d['key1']['key2']['key3']['key4'] = 'value'
print d['key1']['key2']['key3']['key4']

では、このdefaultdictの階層を無限にするにはどうしたらいいか。

class recursivedefaultdict(defaultdict):
    def __init__(self):
        self.default_factory = type(self)

d = recursivedefaultdict()
d['key1']['key2']['key3']['key4']['key5']['key6']['key7']['key8']['key9'] = 'value'
print d['key1']['key2']['key3']['key4']['key5']['key6']['key7']['key8']['key9']

新たにクラスを作って再帰的にそのクラスの型をdefault_factoryにセットすればいいようです。