¿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) 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.
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 eldefaultdict
en 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 unaKeyError
excepción (como un error, que le dice que no pudo encontrar esa clave). Pero en adefaultdict
, en cambio llama a ladefault_factory
funció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 correosdefaultdict
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ó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
defaultdict
en 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()}