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.