ordereddict not name dict python defaultdict

not - python ordereddict to dict



Python: convierte defaultdict a dict (3)

¿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'']}


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)


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.


Simplemente puede llamar a dict :

>>> a defaultdict(<type ''list''>, {''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 el default_factory :

>>> a.default_factory <type ''list''>

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 "<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.