Comment effectuer une itération sur un Python dictionnaire dans l'ordre défini?
Je suis en train de parcourir un dictionnaire que j'ai défini dans un ordre spécifique, mais il a toujours itère dans un ordre différent que ce que j'ai définie dans mon code. C'est juste un exemple de base de ce que je suis en train de faire. Le dictionnaire, je suis à parcourir est beaucoup plus grande, beaucoup plus complexe, nommé clés, et n'est pas dans l'ordre alphabétique/numérique.
level_lookup = \
{
'PRIORITY_1' : { 'level' : 'BAD', 'value' : '' },
'PRIORITY_2' : { 'level' : 'BAD', 'value' : '' },
'PRIORITY_3' : { 'level' : 'BAD', 'value' : '' },
'PRIORITY_4' : { 'level' : 'BAD', 'value' : '' },
'PRIORITY_5' : { 'level' : 'CHECK', 'value' : '' },
'PRIORITY_6' : { 'level' : 'CHECK', 'value' : '' },
'PRIORITY_7' : { 'level' : 'GOOD', 'value' : '' },
'PRIORITY_8' : { 'level' : 'GOOD', 'value' : '' },
}
for priority in level_lookup:
if( level_lookup[ priority ][ 'value' ] == 'TRUE' ):
set_levels += str( priority ) + '\n'
J'ai besoin l'ordre que je définir le dictionnaire pour être conservé au cours d'une itération. Ma commande n'est pas alphabétique, tri par ordre alphabétique n'est pas vraiment utile. Est-il possible de faire cela? J'ai essayé " level_lookup.les éléments(), mais cela ne veut pas maintenir ma commande.
OrderedDict
à la place.Les dictionnaires n'ont pas un ordre. Qui est, les éléments sont à venir dans quelques commande lorsque vous réitérer, mais c'est tout ce qui est plus facile pour Python, et peut ou peut ne pas ressembler à l'ordre dans lequel les éléments ont été mis en, et peut changer lorsque vous ajoutez ou supprimer des éléments. Si vous voulez que vos articles dans une commande, utilisez un récipient qui conserve l'ordre des éléments, tels que
collections.OrderedDict
.OriginalL'auteur PseudoPsyche | 2013-07-16
Vous devez vous connecter pour publier un commentaire.
Vous devez utiliser un OrderedDict. Il fonctionne exactement de la façon dont vous le souhaitez, cependant, vous devez définir de cette façon. Alternativement, vous pouvez avoir une liste de touches dans l'ordre, et de parcourir la liste et l'accès au dictionnaire. Quelque chose le long des lignes de:
Ce sera une douleur à maintenir, alors je vous recommande d'utiliser seulement la OrderedDict.
Comme une dernière option, vous pouvez utiliser les constantes. Comme,
OriginalL'auteur gcbirzan
Si vous êtes bien avec l'aide de la clé de tri par ordre:
C'est ce que je fais généralement si le
dict
est fournie à moi, et pas quelque chose que je instancier (plutôt queOrderedDict
.OriginalL'auteur Dan Lecocq
Vous pourrait utiliser un
collections.OrderedDict
. Si cela ne fonctionne pas pour vous, vous pouvez trier les clés avant de faire une itération sur eux:Noter, cependant, que ce tri des coûts de l'espace linéaire et O(nlogn). Aussi, il utilise la coïncidence du système de numérotation
"PRIORITY_N"
pour le tri, ce qui peut ne pas toujours être valideOriginalL'auteur inspectorG4dget
Essayer;
Comme Jon l'a souligné,
keys()
etiterkeys()
sont ici redondant;iterkeys()
etc... est redondant ici... il suffit d'utilisersorted(level_lookup)
- il va travailler pour Python 2 et 3Il le fait! Merci!
Belle réponse. Je ne sais pas pourquoi ce n'était pas le préféré de "bonne" réponse.
OriginalL'auteur Sam Nicholls
Je pense que vous feriez mieux de pas à l'aide d'un dictionnaire contenant et ne vois pas de raison impérieuse d'utiliser dans ce cas. Un
list
serait de stocker les éléments dans l'ordre souhaité:En fait, vous pourriez écrire la chose qu'compréhension de liste:
OriginalL'auteur martineau