Python3'te OrderedDict normal bir dikteye nasıl dönüştürülür


109

Aşağıdaki problemle mücadele ediyorum OrderedDict: Buna benzer bir dönüştürmek istiyorum:

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

böyle normal bir söze:

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

çünkü onu bir veritabanında string olarak saklamam gerekiyor. Dönüştürmeden sonra sipariş artık önemli değil, bu yüzden sipariş edilen özelliği yine de yedekleyebilirim.

Herhangi bir ipucu veya çözüm için teşekkürler,

Ben


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

evet, bu da çalışıyor. Teşekkürler!
Ben A.

Yanıtlar:


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

Ancak, bir veritabanında saklamak için, onu JSON veya Pickle gibi bir biçime dönüştürmek çok daha iyi olacaktır. Pickle ile düzeni bile korursunuz!


6
yapabilecekleriniz ile düzeni korumak jsonçok .
jfs

Teşekkürler ve ayrıca turşu kullanma tavsiyesi için. Turşu kullanırdım ve aslında başka yerlerde de yaparım, ancak bazı kısıtlamalar dizeye dönüştürülmüş bir dikteyi kullanmayı gerektirir.
Ben A.

Sıralı dikteyi gevşek düzeni dikte etmek için dönüştürmek mi?
RamPrasadBismil

2
Evet düzenini kaybeder.
nael

python <3.0'da da json.loads sırayı korumaz.
nael

70

Bu bir yıllık bir soru olmasına rağmen dict, sipariş edilen diktede sıralı bir dikteniz varsa kullanmanın yardımcı olmayacağını söylemek isterim . Bu özyinelemeli sıralı dikteyi dönüştürmenin en basit yolu,

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
Bir komut dosyası vb. İçin güzel bir hareket, yani bu tek seferlik görev için performans umrumda değil, sadece
diktleri verin ki

7

Bunu gibi OrderedDictnormal bir hesaba dönüştürmek kolaydır Dict:

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

Veritabanınızda bir dize olarak saklamanız gerekiyorsa, JSON kullanmak en iyi yoldur. Bu da oldukça basit ve düzenli bir hesaba dönüştürme konusunda endişelenmenize bile gerek yok dict:

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

Veya verileri doğrudan bir dosyaya aktarın:

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

6

jsonModülü kullanmadan özyinelemeli bir sürüm arıyorsanız :

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

Verilerdeki listeleri işlemez.
Rafe

1

İşte en basit görünen ve python 3.7'de çalışan şey

from collections import OrderedDict

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

Şimdi bunu kontrol etmek için:

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

NOT: Bu da işe yarar ve aynı sonucu verir -

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

Bunun kadar iyi -

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

Şerefe


0

Bir şekilde basit ama farklı bir çözüm istiyorsanız, {**dict}sözdizimini kullanabilirsiniz :

from collections import OrderedDict

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

-3

Basit yolu

>>import json 
>>from collection import OrderedDict

>>json.dumps(dict(OrderedDict([('method', 'constant'), ('data', '1.225')])))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.