Як перетворити OrdersDict у звичайний дикт у python3


109

Я боюся з такою проблемою: я хочу перетворити OrderedDictподібне:

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

у звичайний диктант, як це:

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

тому що я повинен зберігати його як рядок у базі даних. Після конверсії замовлення вже не важливо, тому я можу запалити замовлену функцію в будь-якому випадку.

Дякуємо за будь-яку підказку чи рішення,

Бен


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

так, це також працює. Дякую!
Бен А.

Відповіді:


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

Однак для зберігання його в базі даних було б набагато краще перетворити його у такий формат, як JSON або Pickle. З Pickle ви навіть зберігаєте порядок!



Дякую, а також за пораду із використанням соління. Я б використовував соління, і я це роблю в інших місцях, але деякі обмеження вимагають використання дикта, перетвореного на рядок.
Бен А.

Чи буде перетворення наказуваного вироку на диктувати несанкціонований порядок?
RamPrasadBismil

2
Так, це втрачає порядок.
nael

json.loads також у python <3.0 не зберігає порядок.
nael

70

Незважаючи на те, що це питання за рік, я хотів би сказати, що використання 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
Хороший хід для сценарію і т. Д., Тобто мене не цікавить ефективність цього одноразового завдання, просто
дайте дикти,

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}

-3

Його простий спосіб

>>import json 
>>from collection import OrderedDict

>>json.dumps(dict(OrderedDict([('method', 'constant'), ('data', '1.225')])))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.