Como converter um OrderedDict em um dicionário regular em python3

109

Estou lutando com o seguinte problema: Quero converter um OrderedDictcomo este:

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

em um ditado regular como este:

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

porque tenho que armazená-lo como string em um banco de dados. Após a conversão, o pedido não é mais importante, então posso dispensar o recurso pedido de qualquer maneira.

Obrigado por qualquer dica ou solução,

Ben

Ben A.
fonte
1
repr(dict(OrderedDict([('method', 'constant'), ('data', '1.225')])))?
iruvar
sim, isso funciona bem. Obrigado!
Ben A.

Respostas:

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

No entanto, para armazená-lo em um banco de dados, seria muito melhor convertê-lo para um formato como JSON ou Pickle. Com Pickle você ainda preserva o pedido!

ThiefMaster
fonte
Obrigado, e também pelo conselho sobre o uso de picles. Eu usaria pickle e na verdade faço em outros lugares, mas algumas restrições exigem o uso de um dicionário convertido em string.
Ben A.
Converter ordem ordenaria em ditar ordem solta?
RamPrasadBismil
2
Sim, perde a ordem.
nael
json.loads também em python <3.0 não preserva a ordem.
nael
70

Mesmo que esta seja uma pergunta de um ano, gostaria de dizer que usar dictnão ajudará se você tiver um dict ordenado dentro do dict ordenado. A maneira mais simples de converter esses dict recursivos ordenados 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
Treuvenkadam
fonte
8
Boa jogada para um script etc., ou seja , não me importo com o desempenho para esta tarefa única, apenas me dê os dictos para que eu possa imprimi-los com
perfeição
7

É fácil converter seu OrderedDictem um normal Dictdesta forma:

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

Se você tiver que armazená-lo como uma string em seu banco de dados, usar JSON é o caminho a percorrer. Isso também é bastante simples, e você não precisa se preocupar em converter para um regular dict:

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

Ou despeje os dados diretamente em um arquivo:

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

Se você está procurando uma versão recursiva sem usar o 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
fonte
Não lida com listas de dados.
Rafe
1

Aqui está o que parece mais simples e funciona em python 3.7

from collections import OrderedDict

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

Agora, para verificar isso:

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

NOTA: Isso também funciona e dá o mesmo resultado -

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

Assim como isso -

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

Felicidades

Radtek
fonte
0

Se, de alguma forma, você deseja uma solução simples, mas diferente, pode usar a {**dict}sintaxe:

from collections import OrderedDict

ordered = OrderedDict([('method', 'constant'), ('data', '1.225')])
regular = {**ordered}
Vitalii Dmitriev
fonte
-3

Seu jeito simples

>>import json 
>>from collection import OrderedDict

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