J'ai du mal à utiliser la collections.OrderedDict
classe. 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 textuelle. La commande est essentielle pour comparer avec précision. Peu importe ce que j'essaye, les dictionnaires s'impriment de leur manière non ordonnée habituelle.
Voici ce que j'obtiens 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 imprime l'appel de fonction et met 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 dans l'ordre, mais il ne devrait pas imprimer les autres choses, n'est-ce pas? (La mise en liste et l'affichage de 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 ce n'est que la version Linux.
la source
OrderedDict
est trié par ordre d'insertion et non par ordre de touches alphanumériques.Réponses:
Vous créez un dictionnaire d' abord , en faisant passer ce dictionnaire à un
OrderedDict
. Pour les versions Python <3.6 (*) , au moment où vous faites cela, l'ordre ne sera plus correct.dict
n'est pas ordonné par nature.Passez plutôt une séquence de tuples:
Ce que vous voyez lorsque vous imprimez le
OrderedDict
est sa représentation , et c'est tout à fait correct.OrderedDict([('PRICE', 250), ('HP', 50), ('NAME', 'Albatross'), ('BLASTERS', 13), ('THRUSTERS', 18)])
vous montre simplement, dans une représentation reproductible , quel est le contenu du fichierOrderedDict
.(*) : Dans l'implémentation CPython 3.6, le
dict
type a été mis à jour pour utiliser une structure interne plus efficace en mémoire qui a l'heureux effet secondaire de préserver l'ordre d'insertion, et par extension le code montré dans la question fonctionne sans problèmes. Depuis Python 3.7, la spécification du langage Python a été mise à jour pour exiger que toutes les implémentations Python doivent suivre ce comportement. Voir cette autre réponse pour plus de détails et aussi pourquoi vous voudrez peut-être toujours utiliser unOrderedDict()
dans certains cas.la source
print ship
?? Merci :)OrderedDict
on a créé c'est un dictionnaire.Si vous ne pouvez pas modifier cette partie du code où votre dict a été défini, vous pouvez toujours le commander à tout moment comme vous le souhaitez, comme ceci:
la source
La plupart du temps, nous utilisons OrderedDict lorsque nous avons besoin d'une commande personnalisée et non générique comme ASC, etc.
Voici la solution proposée:
Ce sera la sortie:
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 maintenu. ( Doc officiel )
la source
Utilisez dict.items (); cela peut être aussi simple que suivant:
la source