Làm thế nào để chuyển đổi một OrderedDict thành một chính tả thông thường trong python3


109

Tôi đang đấu tranh với sự cố sau: Tôi muốn chuyển đổi OrderedDictnhư thế này:

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

thành một câu lệnh thông thường như thế này:

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

bởi vì tôi phải lưu trữ nó dưới dạng chuỗi trong cơ sở dữ liệu. Sau khi chuyển đổi, thứ tự không còn quan trọng nữa, vì vậy dù sao thì tôi vẫn có thể sử dụng tính năng đặt hàng.

Cảm ơn mọi gợi ý hoặc giải pháp,

Ben


1
repr(dict(OrderedDict([('method', 'constant'), ('data', '1.225')])))?
iruvar

vâng, điều này cũng hoạt động. Cảm ơn!
Ben A.

Câu trả lời:


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

Tuy nhiên, để lưu trữ nó trong cơ sở dữ liệu, tốt hơn hết bạn nên chuyển đổi nó sang một định dạng như JSON hoặc Pickle. Với Pickle, bạn thậm chí còn bảo toàn đơn hàng!


6
jfs

Cảm ơn, và cũng cho lời khuyên sử dụng dưa chua. Tôi sẽ sử dụng pickle và tôi thực sự làm điều đó ở những nơi khác, nhưng một số ràng buộc yêu cầu sử dụng một dict được chuyển đổi thành chuỗi.
Bến A.

Liệu chuyển đổi sắc lệnh thành lệnh lỏng lẻo?
RamPrasadBismil

2
Có nó không mất trật tự.
nael

json.loads cũng trong python <3.0 không bảo toàn thứ tự.
nael

70

Mặc dù đây là một câu hỏi cũ, nhưng tôi muốn nói rằng việc sử dụng dictsẽ không hữu ích nếu bạn có một câu lệnh có thứ tự trong câu lệnh được sắp xếp. Cách đơn giản nhất có thể chuyển đổi các mệnh lệnh có thứ tự đệ quy đó sẽ là

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
Thoải mái di chuyển cho một kịch bản, vv, nghĩa là tôi không quan tâm về hiệu suất cho này một lần nhiệm vụ, chỉ cần dicts gimme vì vậy tôi khá có thể in chúng
driftcatcher

7

Thật dễ dàng để chuyển đổi của bạn OrderedDictthành thông thường Dictnhư thế này:

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

Nếu bạn phải lưu trữ nó dưới dạng một chuỗi trong cơ sở dữ liệu của mình, sử dụng JSON là cách tốt nhất. Điều đó cũng khá đơn giản và bạn thậm chí không phải lo lắng về việc chuyển đổi thành thông thường dict:

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

Hoặc kết xuất dữ liệu trực tiếp vào một tệp:

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

6

Nếu bạn đang tìm kiếm một phiên bản đệ quy mà không cần sử dụng jsonmô-đun:

def ordereddict_to_dict(value):
    for k, v in value.items():
        if isinstance(v, dict):
            value[k] = ordereddict_to_dict(v)
    return dict(value)

Không xử lý danh sách trong dữ liệu.
Rafe

1

Đây là những gì có vẻ đơn giản nhất và hoạt động trong python 3.7

from collections import OrderedDict

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

Bây giờ để kiểm tra điều này:

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

LƯU Ý: Điều này cũng hoạt động và cho kết quả tương tự -

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

Cũng như điều này -

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

Chúc mừng


0

Nếu bằng cách nào đó bạn muốn một giải pháp đơn giản nhưng khác biệt, bạn có thể sử dụng {**dict}cú pháp:

from collections import OrderedDict

ordered = OrderedDict([('method', 'constant'), ('data', '1.225')])
regular = {**ordered}

-3

Cách đơn giản của nó

>>import json 
>>from collection import OrderedDict

>>json.dumps(dict(OrderedDict([('method', 'constant'), ('data', '1.225')])))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.