Python Nesting Dictionary: OrderedDict de las colecciones

¿Cómo anidar un OrderedDict?

Lo intenté:

table=collections.OrderedDict() table['E']['a']='abc' 

pero esto muestra error.

Intenté también:

 table=collections.OrderedDict(OrderedDict()) table['E']['a']='abc' 

esto también muestra error.

Lo intenté:

 table=collections.OrderedDict() table['E']=collections.OrderedDict() table['E']['a']='abc' 

esto funciona bien

en mi encoding tuve que usar así:

 table=collections.OrderedDict() for lhs in left: table[lhs]=collections.OrderedDict() for val in terminal: table[lhs][val]=0 

que funciona bien. pero ¿hay algún otro método? Mientras leo python gestiona su estructura de datos automáticamente.

¿Existe de todos modos para declarar un diccionario junto con la cantidad de anidación que será y cuáles serán las estructuras de datos de sus nidos en una línea?

usar un bucle adicional solo para declarar que un diccionario parece que me estoy perdiendo algo en Python.

Si realmente quieres hacerlo en una línea, esto funcionaría

 table = collections.OrderedDict([(lhs, collections.OrderedDict(zip(terminal, [0] * len(terminal)))) for lhs in left]) 

Estarías mejor (especialmente si la terminal tiene muchos miembros) haciendo

 zipped = zip(terminal, [0] * len(terminal)) table = collections.OrderedDict([(lhs, collections.OrderedDict(zipped)) for lhs in left]) 

Puede definir su propia subclase personalizada de OrderedDict , manejar el método __missing__ para admitir el anidamiento infinito.

 from collections import OrderedDict class MyDict(OrderedDict): def __missing__(self, key): val = self[key] = MyDict() return val 

Manifestación:

 >>> d = MyDict() >>> d['b']['c']['e'] = 100 >>> d['a']['c']['e'] = 100 >>> d.keys() ['b', 'a'] >>> d['a']['d']['e'] = 100 >>> d['a'].keys() ['c', 'd'] 
 class OrderedDefaultDict(OrderedDict): def __init__(self, default_factory=None, *args, **kwargs): super(OrderedDefaultDict, self).__init__(*args, **kwargs) self.default_factory = default_factory def __missing__(self, key): if self.default_factory is None: raise KeyError(key) val = self[key] = self.default_factory() return val 

Es lo suficientemente simple como subclasificar OrderedDict con comportamiento similar a defaultdict . A continuación, puede utilizar un OrderedDefaultDict siguiente manera:

 table = OrderedDefaultDict(OrderedDict) table['a']['b'] = 3