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


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!



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

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)

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)

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é


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}

-3

Sa manière simple

>>import json 
>>from collection import OrderedDict

>>json.dumps(dict(OrderedDict([('method', 'constant'), ('data', '1.225')])))
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.