無限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にセットすればいいようです。