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


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!



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

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)

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)

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


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}

-3

Caranya sederhana

>>import json 
>>from collection import OrderedDict

>>json.dumps(dict(OrderedDict([('method', 'constant'), ('data', '1.225')])))
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.