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

Ben A.
fuente
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!

ThiefMaster
fuente
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
Thiruvenkadam
fuente
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)
Kyle Neary
fuente
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)
spg
fuente
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

radtek
fuente
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}
Vitalii Dmitriev
fuente
-3

Su manera simple

>>import json 
>>from collection import OrderedDict

>>json.dumps(dict(OrderedDict([('method', 'constant'), ('data', '1.225')])))
Ramesh K
fuente