Una opción alternativa - en función de sus usos, es el uso de tuplas como claves en lugar de los diccionarios anidados:
mydict = {}
mydict['foo', 'bar', 'foobar'] = 25
Este funcionará perfectamente bien a menos que desee obtener una rama del árbol en cualquier punto (en este caso no puede obtener mydict ['foo']).
Si sabía cuántas capas de anidación desea, también podría usar functools.partial
en lugar de lambda.
from functools import partial
from collections import defaultdict
tripledict = partial(defaultdict, partial(defaultdict, dict))
mydict = tripledict()
mydict['foo']['bar']['foobar'] = 25
cual algunas personas encuentran más fácil de leer, y es más rápido para crear instancias de que la solución basada en lambda equivalentes:
python -m timeit -s "from functools import partial" -s "from collections import defaultdict" -s "tripledefaultdict = partial(defaultdict, partial(defaultdict, dict))" "tripledefaultdict()"
1000000 loops, best of 3: 0.281 usec per loop
python -m timeit -s "from collections import defaultdict" -s "recursivedict = lambda: defaultdict(recursivedict)" "recursivedict()"
1000000 loops, best of 3: 0.446 usec per loop
Aunque, como siempre, no hay ningún punto de optimización hasta que sabe que hay es un cuello de botella, así que escoja lo que es más útil y legible antes de lo que es más rápido.
posible duplicado de [Generar claves dict de Python sobre la marcha] (http://stackoverflow.com/questions/3405073/generating-python-dict-keys-on-the -fly) – unutbu