So konvertieren Sie ein OrderedDict in ein reguläres Diktat in Python3

109

Ich habe mit folgendem Problem zu kämpfen: Ich möchte ein solches konvertieren OrderedDict:

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

in ein reguläres Diktat wie dieses:

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

weil ich es als String in einer Datenbank speichern muss. Nach der Konvertierung ist die Bestellung nicht mehr wichtig, so dass ich die bestellte Funktion trotzdem schonen kann.

Vielen Dank für Hinweise oder Lösungen,

Ben

Ben A.
quelle
1
repr(dict(OrderedDict([('method', 'constant'), ('data', '1.225')])))?
iruvar
Ja, das funktioniert auch. Vielen Dank!
Ben A.

Antworten:

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

Um es jedoch in einer Datenbank zu speichern, ist es viel besser, es in ein Format wie JSON oder Pickle zu konvertieren. Mit Pickle behalten Sie sogar die Ordnung!

DiebMaster
quelle
6
Sie können , um mit konservieren jsonzu .
JFS
Danke und auch für den Rat mit Gurke. Ich würde pickle verwenden und ich mache es tatsächlich an anderen Orten, aber einige Einschränkungen erfordern die Verwendung eines in einen String konvertierten Diktats.
Ben A.
Würde die Umwandlung von orderdict in diktierte lose Reihenfolge diktieren?
RamPrasadBismil
2
Ja, es verliert Ordnung.
Nael
json.loads auch in Python <3.0 behält die Reihenfolge nicht bei.
Nael
70

Auch wenn dies eine einjährige Frage ist, möchte ich sagen, dass die Verwendung dictnicht hilft, wenn Sie ein bestelltes Diktat innerhalb des bestellten Diktats haben. Der einfachste Weg, dieses rekursiv geordnete Diktat umzuwandeln, ist

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
quelle
8
Netter Schachzug für ein Skript usw., dh mir ist die Leistung für diese einmalige Aufgabe egal, gib mir nur Diktate, damit ich sie hübsch drucken kann
Driftcatcher
7

Es ist einfach, Ihre OrderedDictin eine reguläre Dictwie folgt umzuwandeln :

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

Wenn Sie es als Zeichenfolge in Ihrer Datenbank speichern müssen, ist die Verwendung von JSON der richtige Weg. Das ist auch ganz einfach, und Sie müssen sich nicht einmal um die Umstellung auf eine reguläre Version kümmern dict:

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

Oder sichern Sie die Daten direkt in einer Datei:

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

Wenn Sie nach einer rekursiven Version suchen, ohne das jsonModul zu verwenden:

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
quelle
Behandelt keine Listen in Daten.
Rafe
1

Folgendes scheint am einfachsten zu sein und funktioniert in Python 3.7

from collections import OrderedDict

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

Um dies zu überprüfen:

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

HINWEIS: Dies funktioniert auch und führt zum gleichen Ergebnis -

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

So gut wie das -

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

Prost

radtek
quelle
0

Wenn Sie irgendwie eine einfache, aber andere Lösung wünschen, können Sie die folgende {**dict}Syntax verwenden:

from collections import OrderedDict

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

Es ist einfach

>>import json 
>>from collection import OrderedDict

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