2017-03-20 1 views
1

Je voudrais itérer sur un OrderedDict dans l'ordre inverse.Comment * paresseux * itérer sur l'ordre inverse des clés en python OrderedDict?

I.e. inverser l'ordre de:

for k, v in my_ordered_dict.iteritems(): 
    # < do stuff > 

Jusqu'à présent, je l'ai obtenu une version non paresseux, en inversant une liste:

for k, v in list(my_ordered_dict.iteritems())[::-1]: 
    # < do stuff > 

Toute idée comment faire mieux?

+0

Essayez http://stackoverflow.com/a/3221487/461887 – sayth

+0

@sayth, une autre question sa – yuval

+0

'inverse()' est pas paresseux - il a besoin d'évaluer l'ensemble 'iterable' pour revenir Dans l'ordre inverse, 'pour k, v dans inversé (my_ordered_dict.iteritems())' est à peu près le meilleur que vous pouvez faire. – AChampion

Répondre

3

Si vous utilisez reversed sur le dict il doit évaluer paresseusement:

for k, v in ((k, my_ordered_dict[k]) for k in reversed(my_ordered_dict)): 
    ..... 

Comment ça marche?

L'élément clé ici est un generator expression, qui est évalué paresseusement. Donc, cela va évaluer paresseusement sur les touches de la commande ordonnée, puis retourner un tuple de la clé et la valeur dict en cas de besoin.

Je ne ai besoin pour soutenir python 3:

En Python 3, dict.items() est maintenant une vue et est évalué paresseusement. Ainsi, ce qui précède peut être simplifié à:

for k, v in reversed(my_ordered_dict.items()): 

Alors que Python 2.7 a une méthode viewitems(), Python 2.7 vues de OrderedDict ne supportent pas le crochet __reversed__ que reversed a besoin d'inverser les non-séquences.

+1

pourriez-vous simplifier cela plus loin à 'pour k, v dans inversé (my_ordered_dict.items()):'? – maxymoo

+0

En python 3, oui ... –

+0

Et pourquoi pas 'pour k, v in inversé (my_ordered_dict.iteritems())' fonctionne pour Py2? – AChampion

-1

Vous pouvez pour dans la gamme avec les valeurs, puis soustraire du nombre de valeurs.

items = my_ordered_dict.iteritems() 
max_index = len(items) 

for i in range(max_index): 
    object = items[max_index - i - 1]