Python: convierte defaultdict a dict

¿Cómo puedo convertir un defaultdict

number_to_letter defaultdict(, {'2': ['a'], '3': ['b'], '1': ['b', 'a']}) 

ser un dictado común?

 {'2': ['a'], '3': ['b'], '1': ['b', 'a']} 

Simplemente puede llamar a dict :

 >>> a defaultdict(, {'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 a default_factory :

 >>> a.default_factory  

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 "", line 1, in  a[4].append(10) KeyError: 4 

Pero la mayoría de las veces esto no vale la pena.

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.

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)