Entonces puedo comenzar len(collection)
y terminar collection[0]
.
También quiero poder acceder al índice de bucle.
Use la reversed()
función incorporada:
>>> a = ["foo", "bar", "baz"]
>>> for i in reversed(a):
... print(i)
...
baz
bar
foo
Para acceder también al índice original, úselo enumerate()
en su lista antes de pasarlo a reversed()
:
>>> for i, e in reversed(list(enumerate(a))):
... print(i, e)
...
2 baz
1 bar
0 foo
Como enumerate()
devuelve un generador y los generadores no se pueden revertir, debe convertirlo en un list
primero.
reversed()
no modifica la lista.reversed()
no hace una copia de la lista (de lo contrario, requeriría O (N) de memoria adicional). Si necesita modificar la lista, usealist.reverse()
; si necesita una copia de la lista en orden inverso, usealist[::-1]
.Tu puedes hacer:
(O lo que quieras hacer en el bucle for.)
El
[::-1]
segmento invierte la lista en el bucle for (pero en realidad no modificará su lista "permanentemente").fuente
[::-1]
crea una copia superficial, por lo tanto, no cambia la matriz ni "permanentemente" ni "temporal".0
, probablemente-1
, por lo que termina al principio ) y paso :-1
(itera hacia atrás a través de la lista,1
elemento a la vez).reversed()
Si necesita el índice de bucle y no desea recorrer la lista completa dos veces, o usar memoria adicional, escribiría un generador.
fuente
reversed(xrange(len(L)))
produce los mismos índices quexrange(len(L)-1, -1, -1)
.for index, item in enumerate(reversed(L)): print len(L)-1-index, item
Se puede hacer así:
Entonces su suposición fue bastante cercana :) Un poco incómodo pero básicamente dice: comience con 1 menos que
len(collection)
, continúe hasta llegar justo antes de -1, en pasos de -1.Para su información, la
help
función es muy útil ya que le permite ver los documentos de algo de la consola de Python, por ejemplo:help(range)
fuente
-1
. Solo diríareversed(xrange(len(collection)))
La
reversed
función integrada es útil:La documentación para revertir explica sus limitaciones.
Para los casos en los que tengo que caminar una secuencia en reversa junto con el índice (por ejemplo, para modificaciones en el lugar que cambian la longitud de la secuencia), tengo esta función definida en mi módulo codeutil:
Éste evita crear una copia de la secuencia. Obviamente, las
reversed
limitaciones aún se aplican.fuente
¿Qué tal si no recrea una nueva lista, puede hacerlo indexando:
O
fuente
O
fuente
Me gusta el enfoque de generador de una línea:
fuente
Además, puede usar las funciones "rango" o "conteo". Como sigue:
También puede usar "contar" de itertools de la siguiente manera:
fuente
3 foo\n2 bar\n1 baz
Use
list.reverse()
y luego repita como lo haría normalmente.http://docs.python.org/tutorial/datastructures.html
fuente
Un enfoque sin importaciones:
o
fuente
fuente
por lo que valga la pena, puedes hacerlo así también. muy simple.
fuente
print a[-(x+1)]
y evitar reasignar el índice en el cuerpo del bucle.Una forma expresiva de lograr
reverse(enumerate(collection))
en Python 3:en python 2:
No estoy seguro de por qué no tenemos una abreviatura para esto, por ejemplo:
o por qué no tenemos
reversed_range()
fuente
Si necesita el índice y su lista es pequeña, la forma más fácil de leer es hacer lo
reversed(list(enumerate(your_list)))
que dice la respuesta aceptada. Pero esto crea una copia de su lista, por lo que si su lista está ocupando una gran parte de la memoria que tendrá que restar el índice devuelveenumerate(reversed())
alen()-1
.Si solo necesitas hacerlo una vez:
o si necesita hacer esto varias veces, debe usar un generador:
fuente
La función inversa es útil aquí:
fuente
También puedes usar un
while
bucle:fuente
Puede usar un índice negativo en un ciclo for ordinario:
Para acceder al índice como si estuviera iterando hacia adelante sobre una copia invertida de la colección, use
i - 1
:Para acceder al índice original no invertido, use
len(collection) - i
:fuente
Si no le importa que el índice sea negativo, puede hacer:
fuente
Creo que la forma más elegante es transformar
enumerate
yreversed
usar el siguiente generadorque genera un reverso del
enumerate
iteradorEjemplo:
Resultado:
fuente
Las otras respuestas son buenas, pero si quieres hacer una lista de estilo de comprensión
fuente
Para usar índices negativos: comience en -1 y retroceda en -1 en cada iteración.
fuente
Una manera simple:
fuente
Creo que esta también es una forma simple de hacerlo ... leer desde el final y seguir decrementando hasta la longitud de la lista, ya que nunca ejecutamos el índice "final", por lo tanto, agregamos -1 también
fuente
Asumiendo que la tarea es encontrar el último elemento que satisfaga alguna condición en una lista (es decir, primero cuando se mira hacia atrás), obtengo los siguientes números:
Entonces, la opción más fea
xrange(len(xs)-1,-1,-1)
es la más rápida.fuente
puedes usar un generador:
finalmente:
Espero que esto te ayude.
fuente