Traverse une liste dans l'ordre inverse en Python
Pour que je puisse commencer à partir de len(collection)
et de fin dans collection[0]
.
EDIT: Désolé, j'ai oublié de mentionner que je veux aussi être en mesure d'accéder à l'indice de boucle.
Vous devez vous connecter pour publier un commentaire.
Utiliser le haut-
inversé()
fonction:Également accéder à l'index d'origine, utilisez
enumerate()
sur votre liste avant de passer àreversed()
:Depuis
enumerate()
retourne un générateur et les générateurs ne peut pas être inversée, vous devez le convertir en unlist
premier.reversed()
ne pas modifier la liste.reversed()
n'est pas de faire une copie de la liste (sinon elle aurait besoin de O(N) de la mémoire supplémentaire). Si vous avez besoin de modifier la liste, utilisezalist.reverse()
; si vous avez besoin d'une copie de la liste dans l'ordre inverse utiliseralist[::-1]
.[a, b, c]
.reversed(list(enumerate(a)))
fonctionne, il n'est pas optimisé. Une alternative est proposée ici à l'aide d'une fonction lambda: christophe-simonis-à-petit.blogspot.ca/2008/08/...enumerate(reversed(a))
serait aussi une solution. Cependant, des indices seront dans l'ordre inverse c'est à dire le dernier élément a un index de0
len(a)-i-1
, et si l'accès à une listeb
de la même longueur,b[-i-1]
est équivalent àb[len(a)-i-1]
(-(ri+1), val) for ri, val in enumerate(reversed(foo))
, voir ma réponse par exemplefor i in range(len(a)-1, -1, -1)
) puisque c'est une ligne et vraiment à éviter toute liste de copie ou de création d'une liste.Que vous pouvez faire:
(Ou ce que vous voulez faire dans la boucle for.)
La
[::-1]
tranche inverse de la liste dans la boucle for (mais ne pas vraiment modifier votre liste de "permanence").[::-1]
crée une copie superficielle, donc il ne change pas le tableau ni "de façon permanente", ni de "temporaire".0
, probablement-1
, ainsi se termine au début) et pas:-1
(itère vers l'arrière dans la liste,1
élément à la fois).reversed()
Si vous avez besoin de l'indice de boucle, et ne veulent pas de parcourir l'ensemble de la liste deux fois, ou de l'utilisation de la mémoire supplémentaire, je ferais un générateur.
reversed(xrange(len(L)))
produit les mêmes indices quexrange(len(L)-1, -1, -1)
.for index, item in enumerate(reversed(L)): print len(L)-1-index, item
xrange(len(L)-1, -1, -1)
devrait faire le travail. En passant, comment se fait -reversed(xrange())
fonctionne maisreversed(enumerate())
ne l'est pas?enumerate
est un pur objet itérateur où, comme xrange est techniquement un sequece.iter(xrange(..))
subit les mêmes restrictions queenumerate
et tout autre itérateur ont.Il peut être fait comme ceci:
Si votre proposition était assez proche 🙂 Un peu maladroit mais c'est essentiellement à dire: commencer par 1 moins de
len(collection)
, continuez jusqu'à ce que vous obtenez tout simplement avant de -1, par pas de -1.Pour info, le
help
fonction est très utile car il vous permet de voir les docs pour quelque chose à partir de la console Python, par exemple:help(range)
-1
s'. Je voudrais juste direreversed(xrange(len(collection)))
La
reversed
builtin fonction est très pratique:La la documentation renversé explique ses limites.
Pour le cas où je dois marcher une séquence en sens inverse le long de l'index (par exemple, pour les modifications de la modification de la longueur de la séquence), j'ai cette fonction définie à l'une de mes codeutil module:
Cela, on évite la création d'une copie de la séquence. De toute évidence, la
reversed
limitations s'appliquent toujours.OU
Comment sur sans recréer une nouvelle liste, vous pouvez le faire par l'indexation:
OU
J'aime les one-liner générateur approche:
Aussi, vous pouvez utiliser soit "plage" ou "compter" des fonctions.
Comme suit:
Vous pouvez également utiliser le "compteur" de itertools comme suit:
3 foo\n2 bar\n1 baz
Utilisation
list.reverse()
et puis itérer comme vous le feriez normalement.http://docs.python.org/tutorial/datastructures.html
pour ce que jamais, il vaut la peine de vous peut faire comme ça aussi. très simple.
print a[-(x+1)]
et d'éviter la ré-affectation des index dans le corps de la boucle.l'inverse de la fonction est très pratique ici:
Autres réponses sont bonnes, mais si vous voulez faire comme
Compréhension de liste style
utilisation de la fonction intégrée dans
reversed()
pour objet de séquence,cette méthode a pour effet de toutes les séquencesplus détaillée lien de référence
Vous pouvez également utiliser un
while
boucle:Une approche facile est:
Vous pouvez utiliser un indice négatif ordinaire dans une boucle for:
Pour accéder à l'index comme si vous étiez une itération sur une inversion de la copie de la collecte, de l'utilisation
i - 1
:Pour accéder à l'original, de l'onu-inversé index, utilisez
len(collection) - i
:Une manière expressive pour atteindre
reverse(enumerate(collection))
en python 3:en python 2:
Je ne suis pas sûr de savoir pourquoi nous n'avons pas une abréviation, pour cela, par exemple.:
ou pourquoi nous n'avons pas
reversed_range()
une autre façon de résoudre ce problème, l'exécution de ce code décrémenté pour boucle
Si vous avez besoin de l'index et votre liste est petite, la plus lisible est de faire
reversed(list(enumerate(your_list)))
comme la accepté de répondre à dit. Mais cela crée une copie de votre liste, de sorte que si votre liste est de prendre une grande partie de votre mémoire, vous devrez soustraire l'index retourné parenumerate(reversed())
delen()-1
.Si vous avez juste besoin de le faire qu'une fois:
ou si vous avez besoin de le faire plusieurs fois, vous devez utiliser un générateur:
À utiliser des indices: commencer à -1 et du recul de -1 à chaque itération.
Une manière simple :
je pense que c'est aussi la manière la plus simple... lire la de fin et garder écoulera jusqu'à la longueur de la liste, puisque nous n'avons jamais exécuter la "fin" de l'index donc ajouté -1 aussi
En supposant que la tâche est de trouver le dernier élément qui satisfait une certaine condition dans une liste (c'est à dire en premier sur la recherche à l'envers), je reçois des numéros suivants:
Donc, le plus laid option
xrange(len(xs)-1,-1,-1)
est le plus rapide.Si vous n'avez pas l'esprit de l'indice est négative, vous pouvez le faire:
Je pense que la façon la plus élégante est de transformer
enumerate
etreversed
à l'aide de la suite de générateurqui génère un revers de la
enumerate
itérateurExemple:
Résultat: