Как преобразовать OrderedDict в обычный dict в 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 вы даже сохраните порядок!



Спасибо, а также за совет по использованию рассола. Я бы использовал рассол, и я действительно делаю это в других местах, но некоторые ограничения требуют использования dict, преобразованного в строку.
Бен А.

Будет ли преобразование заказанного дикта в свободный порядок?
RamPrasadBismil

2
Да, он теряет порядок.
nael 01

json.loads также в python <3.0 не сохраняет порядок.
Nael 01

70

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

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.