not - python ordereddict to dict
Python: convierte defaultdict a dict (3)
¿Cómo puedo convertir un defaultdict
number_to_letter
defaultdict(<class ''list''>, {''2'': [''a''], ''3'': [''b''], ''1'': [''b'', ''a'']})
ser un dictado común?
{''2'': [''a''], ''3'': [''b''], ''1'': [''b'', ''a'']}
Si incluso desea una versión recursiva para convertir un código defaultdict
recursivo en un dict
, puede probar lo siguiente:
#! /usr/bin/env python3
from collections import defaultdict
def ddict():
return defaultdict(ddict)
def ddict2dict(d):
for k, v in d.items():
if isinstance(v, dict):
d[k] = ddict2dict(v)
return dict(d)
myddict = ddict()
myddict["a"]["b"]["c"] = "value"
print(myddict)
mydict = ddict2dict(myddict)
print(mydict)
Si su valor predeterminado está definido recursivamente, por ejemplo:
from collections import defaultdict
recurddict = lambda: defaultdict(recurddict)
data = recurddict()
data["hello"] = "world"
data["good"]["day"] = True
Otra forma sencilla de convertir defaultdict de nuevo a dict es usar el módulo json
import json
data = json.loads(json.dumps(data))
y, por supuesto, los valores contenidos en su punto predeterminado deben limitarse a los tipos de datos compatibles con json, pero no debería ser un problema si no intenta almacenar clases o funciones en el dict.
Simplemente puede llamar a dict
:
>>> a
defaultdict(<type ''list''>, {''1'': [''b'', ''a''], ''3'': [''b''], ''2'': [''a'']})
>>> dict(a)
{''1'': [''b'', ''a''], ''3'': [''b''], ''2'': [''a'']}
pero recuerda que un defaultdict es un dict:
>>> isinstance(a, dict)
True
solo con un comportamiento ligeramente diferente, en el sentido de que cuando intentas acceder a una clave que falta, lo que normalmente KeyError
un KeyError
, en su lugar se llama el default_factory
:
>>> a.default_factory
<type ''list''>
Eso es lo que ve cuando print a
antes de que aparezca el lado de datos del diccionario.
Por lo tanto, otro truco para volver a tener un comportamiento más parecido a un dictado sin hacer un nuevo objeto es restablecer el valor default_factory
:
>>> a.default_factory = None
>>> a[4].append(10)
Traceback (most recent call last):
File "<ipython-input-6-0721ca19bee1>", line 1, in <module>
a[4].append(10)
KeyError: 4
Pero la mayoría de las veces esto no vale la pena.