Jak przekonwertować OrderedDict na zwykły dykt w pythonie3

109

Zmagam się z następującym problemem: Chcę przekonwertować OrderedDicttaki:

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

do zwykłego dyktu, takiego jak ten:

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

ponieważ muszę przechowywać go jako ciąg w bazie danych. Po konwersji kolejność nie jest już ważna, więc i tak mogę oszczędzić zamówioną funkcję.

Dzięki za podpowiedź lub rozwiązania,

Ben

Ben A.
źródło
1
repr(dict(OrderedDict([('method', 'constant'), ('data', '1.225')])))?
iruvar
tak, to też działa. Dzięki!
Ben A.

Odpowiedzi:

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

Jednak aby przechowywać go w bazie danych, znacznie lepiej byłoby przekonwertować go do formatu takiego jak JSON lub Pickle. Z Pickle zachowujesz nawet porządek!

ThiefMaster
źródło
Dzięki, a także za radę przy użyciu marynaty. Używałbym pikle i faktycznie robię to w innych miejscach, ale niektóre ograniczenia wymagają użycia dyktowania przekonwertowanego na ciąg.
Ben A.
Czy zmiana nakazu na dyktowanie luźnego porządku?
RamPrasadBismil
2
Tak, traci porządek.
nael
json.loads również w Pythonie <3.0 nie zachowuje kolejności.
nael
70

Mimo, że jest to pytanie od lat, chciałbym powiedzieć, że używanie dictnie pomoże, jeśli masz uporządkowany dyktando w ramach zamówionego dyktu. Najprostszym sposobem konwersji tych rekurencyjnych uporządkowanych dykt będzie

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
źródło
8
Niezłe posunięcie dla skryptu itp., Tj. Nie obchodzi mnie wydajność tego jednorazowego zadania, po prostu daj mi dykty, żebym mógł je ładnie wydrukować
driftcatcher
7

Łatwo jest przekonwertować swój OrderedDictzwykły na Dicttaki:

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

Jeśli musisz przechowywać go jako ciąg w swojej bazie danych, najlepszym rozwiązaniem jest użycie formatu JSON. Jest to również dość proste i nie musisz się nawet martwić o konwersję do zwykłego dict:

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

Lub zrzuć dane bezpośrednio do pliku:

with open('outFile.txt','w') as o:
    json.dump(d, o)
Kyle Neary
źródło
6

Jeśli szukasz wersji rekurencyjnej bez użycia jsonmodułu:

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
źródło
Nie obsługuje list w danych.
Rafe
1

Oto, co wydaje się najprostsze i działa w Pythonie 3.7

from collections import OrderedDict

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

Teraz, aby to sprawdzić:

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

UWAGA: To również działa i daje ten sam wynik -

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

Tak dobrze jak to -

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

Twoje zdrowie

radtek
źródło
0

Jeśli w jakiś sposób chcesz prostego, ale innego rozwiązania, możesz użyć {**dict}składni:

from collections import OrderedDict

ordered = OrderedDict([('method', 'constant'), ('data', '1.225')])
regular = {**ordered}
Vitalii Dmitriev
źródło
-3

To prosty sposób

>>import json 
>>from collection import OrderedDict

>>json.dumps(dict(OrderedDict([('method', 'constant'), ('data', '1.225')])))
Ramesh K.
źródło