python3でOrderedDictを通常のdictに変換する方法


109

私は次の問題に苦労しています:次のOrderedDictように変換したい:

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

このような通常の辞書に:

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

データベースに文字列として保存する必要があるためです。変換後、順序は重要ではなくなったので、とにかく注文した機能を節約できます。

ヒントや解決策をありがとう

ベン


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

はい、これも機能します。ありがとう!
ベン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などの形式に変換する方がはるかに適切です。ピクルを使用すると、注文を保存することもできます!


6
あなたも順序を維持するjsonことができます
jfs 2013年

ありがとう、そしてピクルスを使ったアドバイスもありがとう。私はピクルスを使用し、実際には他の場所でそれを行いますが、いくつかの制約は文字列に変換されたdictの使用を要求します。
ベンA.

ordereddictを緩い順序のdictに変換しますか?
RamPrasadBismil 2016

2
はい、それは秩序を失います。
nael

python <3.0でもjson.loadsは順序を保持しません。
nael

70

これは1年前の質問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')])))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.