¿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)