¿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']}
python
defaultdict
usuario2988464
fuente
fuente

dict(number_to_letter)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) Truesolo 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: 4pero la mayoría de las veces esto no vale la pena.
fuente
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 eldefaultdicten primer lugar, comodefaultdict(int)odefaultdict(list). Cada vez que intenta buscar una clave en el diccionario, comoa['3'], por ejemplo, en un diccionario habitual, obtiene el valor o genera unaKeyErrorexcepción (como un error, que le dice que no pudo encontrar esa clave). Pero en adefaultdict, en cambio llama a ladefault_factoryfunción para crear un nuevo valor predeterminado (que es el "predeterminado" endefaultdict) para usted.pickle(para guardar objetos de Python en un archivo) no se pueden manejar correosdefaultdictelectró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"] = Trueotra forma sencilla de convertir defaultdict de nuevo a dict es usar el
jsonmóduloimport 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.
fuente
Si incluso desea una versión recursiva para convertir un recursivo
defaultdicten unodict, 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)fuente
defaultdict(lambda: defaultdict(int))):{k: dict(v) for k, v in foo.items()}