Así que puedo comenzar desde len(collection)
y terminar en collection[0]
.Recorrer una lista en orden inverso en Python
EDITAR: Perdón, olvidé mencionar que también quiero poder acceder al índice de ciclo.
Así que puedo comenzar desde len(collection)
y terminar en collection[0]
.Recorrer una lista en orden inverso en Python
EDITAR: Perdón, olvidé mencionar que también quiero poder acceder al índice de ciclo.
Uso del reversed()
función incorporada:
>>> a = ["foo", "bar", "baz"]
>>> for i in reversed(a):
... print i
...
baz
bar
foo
Para acceder también el índice original:
>>> for i, e in reversed(list(enumerate(a))):
... print i, e
...
2 baz
1 bar
0 foo
Uso list.reverse()
y luego iterar como lo haría normalmente.
la función inversa es muy útil aquí:
myArray = [1,2,3,4]
myArray.reverse()
for x in myArray:
print x
list.reverse() no tiene valor de retorno –
que puede hacer:
for item in my_list[::-1]:
print item
(. O lo que quiere hacer en el bucle for)
El segmento [::-1]
invierte la lista en el ciclo for (pero wo en realidad no modifica su lista "permanentemente").
Si necesita el índice de bucle, y no desea recorrer toda la lista dos veces, o usar memoria extra, escribiría un generador.
def reverse_enum(L):
for index in reversed(xrange(len(L))):
yield index, L[index]
L = ['foo', 'bar', 'bas']
for index, item in reverse_enum(L):
print index, item
Llamaría a la función enumerate_reversed, pero podría ser solo mi gusto. Creo que su respuesta es la más limpia para la pregunta específica. – tzot
'invertido (xrange (len (L)))' produce los mismos índices que 'xrange (len (L) -1, -1, -1)'. – jfs
@JF - sí, en ese momento pensé que tenía alguna razón para no hacerlo de esa manera, pero ahora no puedo recordar. Cambiándolo ahora – Triptych
Se puede hacer así:
for i in range(len(collection)-1, -1, -1): print collection[i] # print(collection[i]) for python 3. +
Por lo que su suposición era bastante cerca :) Un poco incómodo pero es básicamente diciendo: comenzar con 1 menos que len(collection)
, seguir adelante hasta llegar a justo antes de -1, por pasos de -1.
FYI, la función help
es muy útil ya que le permite ver los documentos de algo de la consola de Python, por ejemplo:
help(range)
Para las versiones de Python anteriores a la 3.0, creo que es preferible el rango de xrange para rango grande (colección). –
Creo que es correcto :) iirc, range() genera todo el rango como una matriz, pero xrange() devuelve un iterador que solo genera los valores a medida que se necesitan. –
Esto se ve muy raro con tantos '-1'. Solo diría 'invertido (xrange (len (colección)))' – musiphil
La función incorporada reversed
es práctico:
for item in reversed(sequence):
El documentation para revertir explica sus limitaciones.
Para los casos en los que tienen que caminar una secuencia a la inversa junto con el índice (por ejemplo, para modificaciones en lugar cambiando la longitud de la secuencia), tengo esta función se define un módulo de mi codeutil:
import itertools
def reversed_enumerate(sequence):
return itertools.izip(
reversed(xrange(len(sequence))),
reversed(sequence),
)
Esto evita crear una copia de la secuencia. Obviamente, las limitaciones de reversed
aún se aplican.
Las otras respuestas son buenas, pero si usted quiere hacer como estilo comprensión Lista
collection = ['a','b','c']
[item for item in reversed(collection) ]
¿No es esto lo mismo que revertir (recopilación)? Agregar la comprensión de la lista no hace nada, excepto el cálculo innecesario. Es como escribir a = [elemento para el artículo en [1, 2, 3]] vs a = [1, 2, 3]. – EpicDavi
¿Qué tal sin volver a crear una nueva lista, puede hacerlo mediante la indexación:
>>> foo = ['1a','2b','3c','4d']
>>> for i in range(len(foo)):
... print foo[-(i+1)]
...
4d
3c
2b
1a
>>>
O
>>> length = len(foo)
>>> for i in range(length):
... print foo[length-i-1]
...
4d
3c
2b
1a
>>>
uso función integrada de reversed()
para objeto de secuencia, este método tiene el efecto de todas las secuencias
def reverse(spam):
k = []
for i in spam:
k.insert(0,i)
return "".join(k)
Me gusta el enfoque generador de una sola línea:
((i, sequence[i]) for i in reversed(xrange(len(sequence))))
>>> l = ["a","b","c","d"]
>>> l.reverse()
>>> l
['d', 'c', 'b', 'a']
O
>>> print l[::-1]
['d', 'c', 'b', 'a']
Para usar índices negativos: comience en -1 y retroceda en -1 en cada iteración.
>>> a = ["foo", "bar", "baz"]
>>> for i in range(-1, -1*(len(a)+1), -1):
... print i, a[i]
...
-1 baz
-2 bar
-3 foo
También puede utilizar un bucle while
:
i = len(collection)-1
while i>=0:
value = collection[i]
index = i
i-=1
Un enfoque es fácil:
for i in range(1,len(arr)+1):
print(arr[-i])
por lo que cada vez que vale la pena que puede hacerlo de esta manera también. muy simple.
a = [1, 2, 3, 4, 5, 6, 7]
for x in xrange(len(a)):
x += 1
print a[-x]
Puede utilizar un índice negativo en un ordinario para el bucle:
>>> collection = ["ham", "spam", "eggs", "baked beans"]
>>> for i in range(1, len(collection) + 1):
... print(collection[-i])
...
baked beans
eggs
spam
ham
Para acceder al índice como si estuviera iterando hacia adelante sobre una copia invertida de la recolección, uso i - 1
:
>>> for i in range(1, len(collection) + 1):
... print(i-1, collection[-i])
...
0 baked beans
1 eggs
2 spam
3 ham
Para acceder al índice original, no invertida, utilice len(collection) - i
:
>>> for i in range(1, len(collection) + 1):
... print(len(collection)-i, collection[-i])
...
3 baked beans
2 eggs
1 spam
0 ham
Una manera simple:
n = int(input())
arr = list(map(int, input().split()))
for i in reversed(range(0, n)):
print("%d %d" %(i, arr[i]))
Gracias. Por curiosidad, ¿este método invertido crea una copia separada de la colección o simplemente altera el bucle? –
¡No se crea ninguna copia, los elementos se invierten sobre la marcha al atravesar! Esta es una característica importante de todas estas funciones de iteración (que terminan en "ed"). –
La función reverse() hace una copia de la colección. Para modificar una lista existente, use el método .reverse(). –