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


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!


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

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)

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)

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


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}

-3

Es ist einfach

>>import json 
>>from collection import OrderedDict

>>json.dumps(dict(OrderedDict([('method', 'constant'), ('data', '1.225')])))
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.