¿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']}
¿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']}
Respuestas:
Simplemente puede llamar dict
:
>>> a
defaultdict(<type 'list'>, {'1': ['b', 'a'], '3': ['b'], '2': ['a']})
>>> dict(a)
{'1': ['b', 'a'], '3': ['b'], '2': ['a']}
pero recuerde que un defaultdict es un dict:
>>> isinstance(a, dict)
True
solo con un comportamiento ligeramente diferente, ya que cuando intenta acceder a una clave que falta, que normalmente generaría un KeyError
, default_factory
se llama en su lugar:
>>> a.default_factory
<type 'list'>
Eso es lo que ve cuando print a
aparece antes el lado de datos del diccionario.
Entonces, otro truco para recuperar un comportamiento más parecido a un dictado sin realmente crear un nuevo objeto es restablecer 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.
default_factory
? Simplemente no tengo ni idea de lo que está pasando. Lo siento.
default_factory
; esa es la función que pasaste cuando hiciste el defaultdict
en primer lugar, como defaultdict(int)
o defaultdict(list)
. Cada vez que intenta buscar una clave en el diccionario, como a['3']
, por ejemplo, en un diccionario habitual, obtiene el valor o genera una KeyError
excepción (como un error, que le dice que no pudo encontrar esa clave). Pero en a defaultdict
, en cambio llama a la default_factory
función para crear un nuevo valor predeterminado (que es el "predeterminado" en defaultdict
) para usted.
pickle
(para guardar objetos de Python en un archivo) no se pueden manejar correos defaultdict
electrónicos en muchas circunstancias .
Si su defaultdict se define de forma recursiva, 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 json
módulo
import json
data = json.loads(json.dumps(data))
y, por supuesto, los valores contenidos en su defaultdict 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 recursivo defaultdict
en uno 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)
defaultdict(lambda: defaultdict(int))
): {k: dict(v) for k, v in foo.items()}
dict(number_to_letter)