Cara mengonversi OrderedDict menjadi dict biasa di python3

109

Saya berjuang dengan masalah berikut: Saya ingin mengubah OrderedDictseperti ini:

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

menjadi dikt biasa seperti ini:

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

karena saya harus menyimpannya sebagai string dalam database. Setelah konversi, urutannya tidak penting lagi, jadi saya bisa menyimpan fitur yang dipesan.

Terima kasih atas petunjuk atau solusi apa pun,

Ben

Ben A.
sumber
1
repr(dict(OrderedDict([('method', 'constant'), ('data', '1.225')])))?
iruvar
ya, ini juga berfungsi. Terima kasih!
Ben A.

Jawaban:

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

Namun, untuk menyimpannya dalam database, akan lebih baik jika mengubahnya menjadi format seperti JSON atau Pickle. Dengan Pickle, Anda bahkan dapat mempertahankan pesanan!

ThiefMaster
sumber
Terima kasih, dan juga atas saran menggunakan acar. Saya akan menggunakan acar dan saya benar-benar melakukannya di tempat lain, tetapi beberapa kendala meminta menggunakan dict yang diubah menjadi string.
Ben A.
Akankah mengubah perintah perintah menjadi perintah yang longgar?
RamPrasadBismil
2
Ya, itu kehilangan ketertiban.
nael
json.loads juga di python <3.0 tidak mempertahankan urutan.
nael
70

Meskipun ini adalah pertanyaan lama, saya ingin mengatakan bahwa penggunaan dicttidak akan membantu jika Anda memiliki perintah yang diurutkan dalam perintah yang diurutkan. Cara paling sederhana yang dapat mengubah dikt berurutan rekursif tersebut adalah

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
sumber
8
Langkah yang bagus untuk skrip dll., Saya tidak peduli dengan kinerja untuk tugas satu kali ini
berikan saja penis
7

Mudah untuk mengubah Anda OrderedDictmenjadi biasa Dictseperti ini:

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

Jika Anda harus menyimpannya sebagai string dalam database Anda, menggunakan JSON adalah cara yang tepat. Itu juga cukup sederhana, dan Anda bahkan tidak perlu khawatir untuk mengubahnya menjadi biasa dict:

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

Atau buang data langsung ke file:

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

Jika Anda mencari versi rekursif tanpa menggunakan jsonmodul:

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
sumber
Tidak menangani daftar dalam data.
Rafe
1

Inilah yang tampaknya paling sederhana dan berfungsi di python 3.7

from collections import OrderedDict

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

Sekarang untuk memeriksa ini:

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

CATATAN: Ini juga berfungsi, dan memberikan hasil yang sama -

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

Dan juga ini -

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

Bersulang

radtek
sumber
0

Jika entah bagaimana Anda menginginkan solusi yang sederhana namun berbeda, Anda dapat menggunakan {**dict}sintaks:

from collections import OrderedDict

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

Caranya sederhana

>>import json 
>>from collection import OrderedDict

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