Je peux donc commencer len(collection)
et finir collection[0]
.
Je veux également pouvoir accéder à l'index de boucle.
Utilisez la reversed()
fonction intégrée:
>>> a = ["foo", "bar", "baz"]
>>> for i in reversed(a):
... print(i)
...
baz
bar
foo
Pour accéder également à l'index d'origine, utilisez enumerate()
sur votre liste avant de le transmettre à reversed()
:
>>> for i, e in reversed(list(enumerate(a))):
... print(i, e)
...
2 baz
1 bar
0 foo
Étant donné que les enumerate()
retours d'un générateur et des générateurs ne peuvent pas être inversés, vous devez le convertir en list
premier.
reversed()
ne modifie pas la liste.reversed()
ne fait pas de copie de la liste (sinon il faudrait O (N) de mémoire supplémentaire). Si vous devez modifier la liste, utilisezalist.reverse()
; si vous avez besoin d'une copie de la liste dans l'ordre inverse, utilisezalist[::-1]
.Tu peux faire:
(Ou tout ce que vous voulez faire dans la boucle for.)
La
[::-1]
tranche inverse la liste dans la boucle for (mais ne modifiera pas réellement votre liste "définitivement").la source
[::-1]
crée une copie superficielle, donc il ne change pas le tableau ni "de façon permanente" ni "temporaire".0
, probablement-1
, se termine donc au début ) et étape :-1
(itère en arrière dans la liste,1
élément à la fois).reversed()
Si vous avez besoin de l'index de boucle et que vous ne voulez pas parcourir deux fois la liste entière ou utiliser de la mémoire supplémentaire, j'écrirais un générateur.
la source
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
Cela peut se faire comme ceci:
Donc, votre supposition était assez proche :) Un peu gênant, mais il dit essentiellement: commencez avec 1 de moins
len(collection)
, continuez jusqu'à ce que vous arriviez juste avant -1, par pas de -1.Pour info, la
help
fonction est très utile car elle vous permet de visualiser les documents pour quelque chose à partir de la console Python, par exemple:help(range)
la source
-1
. Je dirais justereversed(xrange(len(collection)))
La
reversed
fonction intégrée est pratique:La documentation de reverse explique ses limites.
Pour les cas où je dois parcourir une séquence en sens inverse avec l'index (par exemple pour les modifications sur place modifiant la longueur de la séquence), j'ai cette fonction définie un module my codeutil:
Celui-ci évite de créer une copie de la séquence. De toute évidence, les
reversed
limitations s'appliquent toujours.la source
Que diriez-vous sans recréer une nouvelle liste, vous pouvez le faire en indexant:
OU
la source
OU
la source
J'aime l'approche d'un générateur à une ligne:
la source
Vous pouvez également utiliser les fonctions "plage" ou "nombre". Comme suit:
Vous pouvez également utiliser "count" d'itertools comme suit:
la source
3 foo\n2 bar\n1 baz
Utilisez
list.reverse()
puis répétez comme vous le feriez normalement.http://docs.python.org/tutorial/datastructures.html
la source
Une approche sans importation:
ou
la source
la source
pour ce que ça vaut, vous pouvez le faire comme ça aussi. très simple.
la source
print a[-(x+1)]
et éviter de réaffecter l'index dans le corps de la boucle.Une manière expressive de réaliser
reverse(enumerate(collection))
en python 3:en python 2:
Je ne sais pas pourquoi nous n'avons pas de raccourci pour cela, par exemple:
ou pourquoi nous n'avons pas
reversed_range()
la source
Si vous avez besoin de l'index et que votre liste est petite, le moyen le plus lisible est de faire
reversed(list(enumerate(your_list)))
comme le dit la réponse acceptée. Mais cela crée une copie de votre liste, donc si votre liste prend une grande partie de votre mémoire , vous devez soustraire l'indice retourné parenumerate(reversed())
delen()-1
.Si vous avez juste besoin de le faire une fois:
ou si vous devez le faire plusieurs fois, vous devez utiliser un générateur:
la source
la fonction inverse est utile ici:
la source
Vous pouvez également utiliser une
while
boucle:la source
Vous pouvez utiliser un indice négatif dans une boucle for ordinaire:
Pour accéder à l'index comme si vous faisiez une itération vers l'avant sur une copie inversée de la collection, utilisez
i - 1
:Pour accéder à l'index d'origine non inversé, utilisez
len(collection) - i
:la source
Si cela ne vous dérange pas que l'indice soit négatif, vous pouvez faire:
la source
Je pense que la façon la plus élégante est de transformer
enumerate
et d'reversed
utiliser le générateur suivantce qui génère l'inverse de l'
enumerate
itérateurExemple:
Résultat:
la source
Les autres réponses sont bonnes, mais si vous voulez faire comme style de compréhension de liste
la source
Pour utiliser des indices négatifs: commencez à -1 et reculez de -1 à chaque itération.
la source
Un moyen simple:
la source
je pense que celui-ci est également un moyen simple de le faire ... lire depuis la fin et continuer à décrémenter jusqu'à la longueur de la liste, car nous n'exécutons jamais l'index "end", donc ajouté -1 également
la source
En supposant que la tâche consiste à trouver le dernier élément qui remplit une condition dans une liste (c'est-à-dire d'abord en regardant en arrière), j'obtiens les numéros suivants:
Ainsi, l'option
xrange(len(xs)-1,-1,-1)
la plus laide est la plus rapide.la source
vous pouvez utiliser un générateur:
enfin:
j'espère que cela vous aidera.
la source