วิธีการแปลง OrderDict เป็นคำสั่งปกติใน python3


111

ฉันกำลังดิ้นรนกับปัญหาต่อไปนี้: ฉันต้องการแปลงสิ่งOrderedDictนี้:

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

เป็นคำสั่งปกติเช่นนี้:

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

เพราะฉันต้องจัดเก็บเป็นสตริงในฐานข้อมูล หลังจากการแปลงคำสั่งซื้อไม่สำคัญอีกต่อไปดังนั้นฉันจึงสามารถสำรองคุณลักษณะที่สั่งซื้อไว้ได้

ขอบคุณสำหรับคำแนะนำหรือวิธีแก้ปัญหา

เบน


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

ใช่มันใช้งานได้เช่นกัน ขอบคุณ!
Ben A.

คำตอบ:


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

อย่างไรก็ตามในการจัดเก็บไว้ในฐานข้อมูลจะเป็นการดีกว่ามากหากแปลงเป็นรูปแบบเช่น JSON หรือ Pickle ด้วย Pickle คุณยังคงรักษาคำสั่งซื้อ!



ขอบคุณและสำหรับคำแนะนำในการใช้ผักดอง ฉันจะใช้ผักดองและฉันก็ทำในที่อื่น แต่มีข้อ จำกัด บางอย่างที่ต้องการโดยใช้การแปลงตามคำสั่งเป็นสตริง
Ben A.

การแปลงคำสั่งให้เป็นคำสั่งแบบหลวม ๆ หรือไม่?
RamPrasadBismil

2
ใช่มันจะสูญเสียคำสั่งซื้อ
nael

1
โปรดทราบว่า thos ใช้ไม่ได้กับข้อมูล OrderDictionary ที่ซ้อนกัน @thiruvenkadam ควรเป็นคำตอบที่ยอมรับ
Micheal J. Roberts

73

แม้ว่าคำถามนี้จะเป็นปี แต่ฉันก็อยากจะบอกว่าการใช้ dictจะไม่ช่วยอะไรถ้าคุณมีคำสั่งที่อยู่ในคำสั่ง dict วิธีที่ง่ายที่สุดในการแปลงคำสั่งแบบเรียกซ้ำเหล่านั้นคือ

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
เป็นไปได้ดีสำหรับสคริปต์ ฯลฯ เช่นฉันไม่สนใจเกี่ยวกับประสิทธิภาพสำหรับงานครั้งเดียวนี้เพียงแค่อ้างว่าเขียนตามคำสั่งดังนั้นฉันจึงสามารถพิมพ์ได้สวย
driftcatcher

7

ง่ายต่อการแปลงของคุณOrderedDictเป็นปกติDictเช่นนี้:

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

หากคุณต้องจัดเก็บเป็นสตริงในฐานข้อมูลของคุณการใช้ JSON เป็นวิธีที่จะไป นอกจากนี้ยังค่อนข้างง่ายและคุณไม่ต้องกังวลกับการแปลงเป็นแบบปกติdict:

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

หรือถ่ายโอนข้อมูลไปยังไฟล์โดยตรง:

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

6

หากคุณกำลังมองหาเวอร์ชันเรียกซ้ำโดยไม่ใช้jsonโมดูล:

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

ไม่จัดการรายการในข้อมูล
Rafe

1

นี่คือสิ่งที่ดูเหมือนง่ายที่สุดและใช้งานได้ใน python 3.7

from collections import OrderedDict

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

ตอนนี้เพื่อตรวจสอบสิ่งนี้:

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

หมายเหตุ: วิธีนี้ใช้งานได้เช่นกันและให้ผลลัพธ์เหมือนกัน -

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

เช่นเดียวกับสิ่งนี้ -

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

ไชโย


0

หากคุณต้องการวิธีแก้ปัญหาที่เรียบง่าย แต่แตกต่างออกไปคุณสามารถใช้{**dict}ไวยากรณ์:

from collections import OrderedDict

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.