Comment convertir un OrderedDict en un dict régulier en python3

109

Je suis aux prises avec le problème suivant: je veux convertir un OrderedDictcomme celui-ci:

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

dans un dict régulier comme celui-ci:

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

car je dois le stocker sous forme de chaîne dans une base de données. Après la conversion, la commande n'est plus importante, donc je peux quand même épargner la fonction commandée.

Merci pour tout indice ou solution,

Ben

Ben A.
la source
1
repr(dict(OrderedDict([('method', 'constant'), ('data', '1.225')])))?
iruvar
oui, cela fonctionne aussi. Merci!
Ben A.

Réponses:

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

Cependant, pour le stocker dans une base de données, il serait bien préférable de le convertir dans un format tel que JSON ou Pickle. Avec Pickle, vous préservez même la commande!

ThiefMaster
la source
6
vous pouvez préserver l' ordre avec jsontrop .
jfs
Merci, et aussi pour les conseils d'utilisation du cornichon. J'utiliserais pickle et je le fais en fait à d'autres endroits, mais certaines contraintes exigent l'utilisation d'un dict converti en chaîne.
Ben A.
Est-ce que convertir ordonnédict pour dicter un ordre lâche?
RamPrasadBismil
2
Oui, il perd de l'ordre.
nael
json.loads également en python <3.0 ne préserve pas l'ordre.
nael
70

Même s'il s'agit d'une question vieille d'un an, je voudrais dire que l'utilisation dictne vous aidera pas si vous avez un dict ordonné dans le dict ordonné. Le moyen le plus simple de convertir ces dict ordonnés récursifs sera

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
Thiruvenkadam
la source
8
Belle initiative pour un script , etc., à savoir que je ne se soucient pas de la performance pour cette unique tâche, Donne - moi juste dicts donc je peux assez les imprimer
driftcatcher
7

Il est facile de convertir votre OrderedDicten un régulier Dictcomme ceci:

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

Si vous devez le stocker sous forme de chaîne dans votre base de données, l'utilisation de JSON est la solution. C'est aussi assez simple, et vous n'avez même pas à vous soucier de la conversion en régulier dict:

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

Ou vider les données directement dans un fichier:

with open('outFile.txt','w') as o:
    json.dump(d, o)
Kyle Neary
la source
6

Si vous recherchez une version récursive sans utiliser le jsonmodule:

def ordereddict_to_dict(value):
    for k, v in value.items():
        if isinstance(v, dict):
            value[k] = ordereddict_to_dict(v)
    return dict(value)
spg
la source
Ne gère pas les listes dans les données.
Rafe
1

Voici ce qui semble le plus simple et fonctionne en python 3.7

from collections import OrderedDict

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

Maintenant pour vérifier ceci:

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

REMARQUE: cela fonctionne également et donne le même résultat -

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

Ainsi que cette -

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

À votre santé

Radtek
la source
0

Si vous voulez une solution simple mais différente, vous pouvez utiliser la {**dict}syntaxe:

from collections import OrderedDict

ordered = OrderedDict([('method', 'constant'), ('data', '1.225')])
regular = {**ordered}
Vitalii Dmitriev
la source
-3

Sa manière simple

>>import json 
>>from collection import OrderedDict

>>json.dumps(dict(OrderedDict([('method', 'constant'), ('data', '1.225')])))
Ramesh K
la source