J'ai quelques difficultés à utiliser la classe collections.OrderedDict
. J'utilise Python 2.7 sur Raspbian, la distribution Debian pour Raspberry Pi. J'essaie d'imprimer deux dictionnaires afin de les comparer (côte à côte) pour une aventure texte. L'ordre est essentiel pour comparer avec précision. Peu importe ce que j'essaie, les dictionnaires s'impriment à leur manière habituelle sans ordre.
Voici ce que je reçois quand je le fais sur mon RPi:
import collections
ship = {"NAME": "Albatross",
"HP":50,
"BLASTERS":13,
"THRUSTERS":18,
"PRICE":250}
ship = collections.OrderedDict(ship)
print ship
# OrderedDict([('PRICE', 250), ('HP', 50), ('NAME', 'Albatross'), ('BLASTERS', 13), ('THRUSTERS', 18)])
De toute évidence, il y a quelque chose qui ne va pas car il s'agit d'imprimer l'appel de fonction et de placer les clés et les groupes de valeurs dans une liste imbriquée ...
Voici ce que j'ai obtenu en exécutant quelque chose de similaire sur mon PC:
import collections
Joe = {"Age": 28, "Race": "Latino", "Job": "Nurse"}
Bob = {"Age": 25, "Race": "White", "Job": "Mechanic", "Random": "stuff"}
#Just for clarity:
Joe = collections.OrderedDict(Joe)
Bob = collections.OrderedDict(Bob)
print Joe
# OrderedDict([('Age', 28), ('Race', 'Latino'), ('Job', 'Nurse')])
print Bob
# OrderedDict([('Age', 25), ('Race', 'White'), ('Job', 'Mechanic'), ('Random', 'stuff')])
Cette fois, c'est correct, mais vous ne devriez pas imprimer les autres choses, n'est-ce pas? (Le mettre dans la liste et montrant l'appel de fonction.)
Où est-ce que je fais mon erreur? Cela ne devrait rien avoir à voir avec la version pi de Python car il ne s'agit que de la version Linux.
Vous créez d'abord un dictionnaire , puis vous le transmettez à un OrderedDict
. Pour Python versions <3.6 (*), au moment où vous faites cela, la commande ne sera plus correcte. dict
n'est par nature pas ordonné.
Passez une séquence de tuples à la place:
ship = [("NAME", "Albatross"),
("HP", 50),
("BLASTERS", 13),
("THRUSTERS", 18),
("PRICE", 250)]
ship = collections.OrderedDict(ship)
Ce que vous voyez lorsque vous imprimez la OrderedDict
est sa représentation , et elle est tout à fait correcte. OrderedDict([('PRICE', 250), ('HP', 50), ('NAME', 'Albatross'), ('BLASTERS', 13), ('THRUSTERS', 18)])
vous montre simplement, dans une représentation reproductible , le contenu de la OrderedDict
.
(*): Dans l'implémentation CPython 3.6, le type dict
a été mis à jour pour utiliser une structure interne plus efficace en termes de mémoire qui a pour effet secondaire de préserver l'ordre d'insertion et, par extension, le code présenté dans la question fonctionne sans problème. À partir de Python 3.7, la spécification du langage Python a été mise à jour pour exiger que toutes les implémentations de Python soient les mêmes. ce comportement. Voir cette autre réponse est la mienne pour plus de détails et pourquoi vous voudriez quand même utiliser une OrderedDict()
dans certains cas.
Si vous ne pouvez pas éditer cette partie du code où votre dict a été défini, vous pouvez quand même le commander à votre guise, comme ceci:
from collections import OrderedDict
order_of_keys = ["key1", "key2", "key3", "key4", "key5"]
list_of_tuples = [(key, your_dict[key]) for key in order_of_keys]
your_dict = OrderedDict(list_of_tuples)
La plupart du temps, nous choisissons OrderedDict lorsque nous avons besoin d’une commande personnalisée et non d’une commande générique telle que ASC, etc.
Voici la solution proposée:
import collections
ship = {"NAME": "Albatross",
"HP":50,
"BLASTERS":13,
"THRUSTERS":18,
"PRICE":250}
ship = collections.OrderedDict(ship)
print ship
new_dict = collections.OrderedDict()
new_dict["NAME"]=ship["NAME"]
new_dict["HP"]=ship["HP"]
new_dict["BLASTERS"]=ship["BLASTERS"]
new_dict["THRUSTERS"]=ship["THRUSTERS"]
new_dict["PRICE"]=ship["PRICE"]
print new_dict
Ce sera la sortie:
OrderedDict([('PRICE', 250), ('HP', 50), ('NAME', 'Albatross'), ('BLASTERS', 13), ('THRUSTERS', 18)])
OrderedDict([('NAME', 'Albatross'), ('HP', 50), ('BLASTERS', 13), ('THRUSTERS', 18), ('PRICE', 250)])
Remarque : les nouveaux dictionnaires triés conservent leur ordre de tri lorsque les entrées sont supprimées. Mais lorsque de nouvelles clés sont ajoutées, les clés sont ajoutées à la fin et le tri n'est pas conservé. ( document officiel )