Come convertire un OrderedDict in un normale dict in python3


109

Sto lottando con il seguente problema: voglio convertire un OrderedDictcome questo:

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

in un dict regolare come questo:

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

perché devo memorizzarlo come stringa in un database. Dopo la conversione l'ordine non è più importante, quindi posso comunque risparmiare la funzione ordinata.

Grazie per qualsiasi suggerimento o soluzione,

Ben


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

sì, funziona anche questo. Grazie!
Ben A.

Risposte:


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

Tuttavia, per archiviarlo in un database sarebbe molto meglio convertirlo in un formato come JSON o Pickle. Con Pickle conservi anche l'ordine!



Grazie, e anche per il consiglio di usare il sottaceto. Userei pickle e in realtà lo faccio in altri posti, ma alcuni vincoli richiedono l'utilizzo di un dict convertito in stringa.
Ben A.

Convertire il comando ordinato per imporre un ordine sciolto?
RamPrasadBismil

2
Sì, perde l'ordine.
nael

json.loads anche in python <3.0 non conserva l'ordine.
nael

70

Anche se questa è una domanda vecchia di un anno, vorrei dire che l'utilizzo dictnon aiuterà se hai un dict ordinato all'interno del dict ordinato. Il modo più semplice per convertire quei dict ordinati ricorsivi sarà

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
Bella mossa per una sceneggiatura ecc., Ad esempio, non mi interessa le prestazioni per questo compito una tantum, dammi solo i dettami così posso stamparli abbastanza
driftcatcher

7

È facile convertire il tuo OrderedDictin un normale Dictcome questo:

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

Se devi archiviarlo come stringa nel tuo database, usare JSON è la strada da percorrere. Anche questo è abbastanza semplice e non devi nemmeno preoccuparti di convertire in un normale dict:

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

Oppure scarica i dati direttamente in un file:

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

6

Se stai cercando una versione ricorsiva senza utilizzare il jsonmodulo:

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

Non gestisce gli elenchi nei dati.
Rafe

1

Ecco cosa sembra più semplice e funziona in Python 3.7

from collections import OrderedDict

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

Ora per controllare questo:

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

NOTA: anche questo funziona e dà lo stesso risultato -

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

Oltre a questo -

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

Saluti


0

Se in qualche modo vuoi una soluzione semplice, ma diversa, puoi usare la {**dict}sintassi:

from collections import OrderedDict

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

-3

È un modo semplice

>>import json 
>>from collection import OrderedDict

>>json.dumps(dict(OrderedDict([('method', 'constant'), ('data', '1.225')])))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.