Cómo convertir un OrderedDict en un dictado regular en python3


109

Estoy luchando con el siguiente problema: quiero convertir uno OrderedDictcomo este:

OrderedDict([('method', 'constant'), ('data', '1.225')])

en un dictado regular como este:

{'method': 'constant', 'data':1.225}

porque tengo que almacenarlo como una cadena en una base de datos. Después de la conversión, el orden ya no es importante, así que puedo prescindir de la función ordenada de todos modos.

Gracias por cualquier sugerencia o solución,

Ben


1
repr(dict(OrderedDict([('method', 'constant'), ('data', '1.225')])))?
iruvar

sí, esto también funciona. ¡Gracias!
Ben A.

Respuestas:


95
>>> from collections import OrderedDict
>>> OrderedDict([('method', 'constant'), ('data', '1.225')])
OrderedDict([('method', 'constant'), ('data', '1.225')])
>>> dict(OrderedDict([('method', 'constant'), ('data', '1.225')]))
{'data': '1.225', 'method': 'constant'}
>>>

Sin embargo, para almacenarlo en una base de datos sería mucho mejor convertirlo a un formato como JSON o Pickle. ¡Con Pickle incluso conservas el orden!



Gracias, y también por el consejo sobre el uso de pickle. Yo usaría pickle y de hecho lo hago en otros lugares, pero algunas restricciones exigen el uso de un dictado convertido a cadena.
Ben A.

¿Convertir el orden en orden se traduciría en un dictado de orden suelto?
RamPrasadBismil

2
Sí, pierde el orden.
nael

json.loads también en python <3.0 no conserva el orden.
nael

70

Aunque esta es una pregunta de hace un año, me gustaría decir que el uso dictno ayudará si tiene un dictado ordenado dentro del dictado ordenado. La forma más sencilla de convertir esos dictados ordenados recursivos será

import json
from collections import OrderedDict
input_dict = OrderedDict([('method', 'constant'), ('recursive', OrderedDict([('m', 'c')]))])
output_dict = json.loads(json.dumps(input_dict))
print output_dict

8
Buen movimiento para un guión, etc., es decir , no me importa el rendimiento para esta tarea única, solo dame dictados para poder imprimirlos bastante
driftcatcher

7

Es fácil convertir tu OrderedDicta un regular Dictcomo este:

dict(OrderedDict([('method', 'constant'), ('data', '1.225')]))

Si tiene que almacenarlo como una cadena en su base de datos, usar JSON es el camino a seguir. Eso también es bastante simple, y ni siquiera tiene que preocuparse por convertir a regular dict:

import json
d = OrderedDict([('method', 'constant'), ('data', '1.225')])
dString = json.dumps(d)

O volcar los datos directamente en un archivo:

with open('outFile.txt','w') as o:
    json.dump(d, o)

6

Si está buscando una versión recursiva sin usar el jsonmódulo:

def ordereddict_to_dict(value):
    for k, v in value.items():
        if isinstance(v, dict):
            value[k] = ordereddict_to_dict(v)
    return dict(value)

No maneja listas en datos.
Rafe

1

Esto es lo que parece más simple y funciona en Python 3.7

from collections import OrderedDict

d = OrderedDict([('method', 'constant'), ('data', '1.225')])
d2 = dict(d)  # Now a normal dict

Ahora para comprobar esto:

>>> type(d2)
<class 'dict'>
>>> isinstance(d2, OrderedDict)
False
>>> isinstance(d2, dict)
True

NOTA: Esto también funciona y da el mismo resultado:

>>> {**d}
{'method': 'constant', 'data': '1.225'}
>>> {**d} == d2
True

Tan bien como esto -

>>> dict(d)
{'method': 'constant', 'data': '1.225'}
>>> dict(d) == {**d}
True

Salud


0

Si de alguna manera desea una solución simple pero diferente, puede usar la {**dict}sintaxis:

from collections import OrderedDict

ordered = OrderedDict([('method', 'constant'), ('data', '1.225')])
regular = {**ordered}

-3

Su manera simple

>>import json 
>>from collection import OrderedDict

>>json.dumps(dict(OrderedDict([('method', 'constant'), ('data', '1.225')])))
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.