2009-02-09 78 views

Respuesta

739

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 
+1

Gracias. Por curiosidad, ¿este método invertido crea una copia separada de la colección o simplemente altera el bucle? –

+75

¡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"). –

+0

La función reverse() hace una copia de la colección. Para modificar una lista existente, use el método .reverse(). –

0

la función inversa es muy útil aquí:

myArray = [1,2,3,4] 
myArray.reverse() 
for x in myArray: 
    print x 
+0

list.reverse() no tiene valor de retorno –

111

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").

+16

' [:: - 1] 'crea una copia superficial, por lo tanto, no cambia la matriz ni "permanentemente" ni "temporal". – jfs

+5

Esto es un poco más lento que usarlo al revés, al menos bajo Python 2.7 (probado). – kgriffs

+1

Esto funciona para objetos de consulta, reversed() no. ¡¡¡Gracias!!! – Roman

52

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 
+1

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

+1

'invertido (xrange (len (L)))' produce los mismos índices que 'xrange (len (L) -1, -1, -1)'. – jfs

+0

@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

36

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)

+0

Para las versiones de Python anteriores a la 3.0, creo que es preferible el rango de xrange para rango grande (colección). –

+0

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. –

+7

Esto se ve muy raro con tantos '-1'. Solo diría 'invertido (xrange (len (colección)))' – musiphil

15

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.

1

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) ] 
+0

¿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

3

¿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 
>>> 
1
def reverse(spam): 
    k = [] 
    for i in spam: 
     k.insert(0,i) 
    return "".join(k) 
3

Me gusta el enfoque generador de una sola línea:

((i, sequence[i]) for i in reversed(xrange(len(sequence)))) 
4
>>> l = ["a","b","c","d"] 
>>> l.reverse() 
>>> l 
['d', 'c', 'b', 'a'] 

O

>>> print l[::-1] 
['d', 'c', 'b', 'a'] 
0

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 
1

También puede utilizar un bucle while:

i = len(collection)-1 
while i>=0: 
    value = collection[i] 
    index = i 
    i-=1 
0

Un enfoque es fácil:

for i in range(1,len(arr)+1): 
    print(arr[-i]) 
1

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] 
+0

También puede hacer 'imprimir a [- (x + 1)]' y evitar reasignar el índice en el cuerpo del ciclo. – Malcolm

+0

eso es genial! :) – emorphus

0

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 
0

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])) 
Cuestiones relacionadas