¿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_factoryse llama en su lugar:
>>> a.default_factory
<type 'list'>
Eso es lo que ve cuando print aaparece 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 defaultdicten 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 KeyErrorexcepción (como un error, que le dice que no pudo encontrar esa clave). Pero en a defaultdict, en cambio llama a la default_factoryfunció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 defaultdictelectró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 jsonmó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 defaultdicten 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)