OrderedDict를 python3에서 일반 dict로 변환하는 방법


109

다음 문제로 어려움을 겪고 있습니다. 다음과 OrderedDict같이 변환하고 싶습니다.

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

다음과 같은 일반 사전으로 :

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

데이터베이스에 문자열로 저장해야하기 때문입니다. 변환 후 주문은 더 이상 중요하지 않으므로 어쨌든 주문한 기능을 절약 할 수 있습니다.

힌트 나 해결책에 감사드립니다.


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

예, 이것도 작동합니다. 감사!
Ben A.

답변:


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를 사용합니다.
Ben A.

ordereddict를 느슨한 주문으로 변환할까요?
RamPrasadBismil

2
네, 질서를 잃습니다.
nael

Python <3.0에서도 json.loads는 순서를 유지하지 않습니다.
nael

70

이것은 1 년 된 질문이지만, 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
등의 스크립트에 대한 좋은 움직임, 즉 나는 꽤 인쇄 할 수 있습니다이 일회성 작업, 단지 내놔 dicts 있도록 성능에 대해 걱정하지 않는다
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

다음은 가장 간단하고 파이썬 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')])))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.