anidando defaultdicts en una profundidad arbitraria

Me gustaría anidar un número arbitrario de defaultdicts así:

from collections import defaultdict D = defaultdict( lambda:defaultdict(int) ) 

esto funciona bien como se describió anteriormente .

Ahora estoy buscando la forma / función para hacer esto con una profundidad arbitraria: por ejemplo, me gustaría tener una función

 def Gen_DDict( dim=3 ): "code I'm looking for" 

que devolverá esto para dim = 3:

 defaultdict( lambda : defaultdict( lambda : defaultdict(int) ) ) 

 def genDDict(dim=3): if dim==1: return collections.defaultdict(int) else: return collections.defaultdict(lambda: genDDict(dim-1)) 

Salida:

 In [257]: d = genDDict(2) In [258]: d[2][1] Out[258]: 0 

También puede hacer esto de forma iterativa con una construcción de bucle for desde el interior hacia afuera:

 def Gen_DDict(dim=3, inner_factory=int): factory = defaultdict(inner_factory) def get_factory(z): def factory_func(): return z return factory_func for i in range(dim-1): factory = defaultdict(get_factory(factory)) return factory