una recorrer matriz lista invertir inverso for python loops reverse

recorrer - invertir lista python 3



Recorrer una lista en orden inverso en Python (24)

Así que puedo comenzar desde len(collection) y terminar en collection[0] .

EDITAR: Lo siento, olvidé mencionar que también quiero poder acceder al índice de bucle.


¿Qué tal si sin recrear una nueva lista, puede hacerlo indexando:

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


Además, puede usar las funciones "rango" o "contar". Como sigue:

a = ["foo", "bar", "baz"] for i in range(len(a), 0, -1): print(i, a[i-1]) 3 baz 2 bar 1 foo

También puede utilizar "contar" de itertools de la siguiente manera:

a = ["foo", "bar", "baz"] from itertools import count, takewhile def larger_than_0(x): return x > 0 for x in takewhile(larger_than_0, count(3, -1)): print(x, a[x-1]) 3 baz 2 bar 1 foo


La función incorporada reversed es útil:

for item in reversed(sequence):

La documentation para anular explica sus limitaciones.

Para los casos en los que tengo que recorrer una secuencia en sentido inverso junto con el índice (por ejemplo, para modificaciones in situ que cambian la longitud de la secuencia), tengo esta función definida en mi módulo codeutil:

import itertools def reversed_enumerate(sequence): return itertools.izip( reversed(xrange(len(sequence))), reversed(sequence), )

Éste evita crear una copia de la secuencia. Obviamente, las limitaciones reversed todavía se aplican.


La función inversa es útil aquí:

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


Las otras respuestas son buenas, pero si quieres hacerlo como estilo de comprensión de lista

collection = [''a'',''b'',''c''] [item for item in reversed( collection ) ]


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

((i, sequence[i]) for i in reversed(xrange(len(sequence))))


Para usar índices negativos: comience en -1 y retroceda por -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


Por todo lo que vale la pena, puedes hacerlo así también. muy simple.

a = [1, 2, 3, 4, 5, 6, 7] for x in xrange(len(a)): x += 1 print a[-x]


Puedes usar un índice negativo en un bucle ordinario:

>>> 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 colección, use 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 sin reversión, use 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


Se puede hacer así:

for i in range(len(collection)-1, -1, -1): print collection[i] # print(collection[i]) for python 3. +

Entonces, tu suposición fue bastante cercana :) Un poco incómodo, pero básicamente dice: comienza con 1 menos que len(collection) , continúa hasta que llegues justo antes de -1, por pasos de -1.

Para tu información, la función de help es muy útil, ya que te permite ver los documentos de algo de la consola de Python, por ejemplo:

help(range)


Si necesita el índice de bucle y no desea recorrer la lista completa dos veces, o usar memoria adicional, 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


Si necesita el índice, la forma más sencilla es restar el índice devuelto por enumerate(reversed()) de len()-1 . enumerate() no toma un argumento de step .

Si necesita hacer esto varias veces, debe usar un generador:

a = [''b'', ''d'', ''c'', ''a''] def enumerate_reversed(lyst): for index, value in enumerate(reversed(lyst)): index = len(lyst)-1 - index yield index, value for index, value in enumerate_reversed(a): do_something(index, value)

o si solo necesitas hacerlo una vez:

for index, value in enumerate(reversed(a)): index = len(a)-1 - index do_something(index, value)


Suponiendo que la tarea es encontrar el último elemento que satisface alguna condición en una lista (es decir, primero al mirar hacia atrás), obtengo los siguientes números:

>>> min(timeit.repeat(''for i in xrange(len(xs)-1,-1,-1):/n if 128 == xs[i]: break'', setup=''xs, n = range(256), 0'', repeat=8)) 4.6937971115112305 >>> min(timeit.repeat(''for i in reversed(xrange(0, len(xs))):/n if 128 == xs[i]: break'', setup=''xs, n = range(256), 0'', repeat=8)) 4.809093952178955 >>> min(timeit.repeat(''for i, x in enumerate(reversed(xs), 1):/n if 128 == x: break'', setup=''xs, n = range(256), 0'', repeat=8)) 4.931743860244751 >>> min(timeit.repeat(''for i, x in enumerate(xs[::-1]):/n if 128 == x: break'', setup=''xs, n = range(256), 0'', repeat=8)) 5.548468112945557 >>> min(timeit.repeat(''for i in xrange(len(xs), 0, -1):/n if 128 == xs[i - 1]: break'', setup=''xs, n = range(256), 0'', repeat=8)) 6.286104917526245 >>> min(timeit.repeat(''i = len(xs)/nwhile 0 < i:/n i -= 1/n if 128 == xs[i]: break'', setup=''xs, n = range(256), 0'', repeat=8)) 8.384078979492188

Entonces, la opción más fea xrange(len(xs)-1,-1,-1) es la más rápida.


También puedes usar un bucle while:

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


Tu puedes hacer:

for item in my_list[::-1]: print item

(O lo que quieras hacer en el bucle for).

El segmento [::-1] invierte la lista en el bucle for (pero en realidad no modificará su lista "permanentemente").


Un enfoque fácil es:

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


Una forma expresiva de lograr el reverse(enumerate(collection)) en python 3:

zip(reversed(range(len(collection))), reversed(collection))

en python 2:

izip(reversed(xrange(len(collection))), reversed(collection))

No estoy seguro de por qué no tenemos una taquigrafía para esto, por ejemplo:

def reversed_enumerate(collection): return zip(reversed(range(len(collection))), reversed(collection))

o por qué no tenemos reversed_range()


Una forma sencilla:

n = int(input()) arr = list(map(int, input().split())) for i in reversed(range(0, n)): print("%d %d" %(i, arr[i]))



Utilice la función incorporada reversed() :

>>> a = ["foo", "bar", "baz"] >>> for i in reversed(a): ... print i ... baz bar foo

Para acceder también al índice original:

>>> for i, e in reversed(list(enumerate(a))): ... print i, e ... 2 baz 1 bar 0 foo



>>> l = ["a","b","c","d"] >>> l.reverse() >>> l [''d'', ''c'', ''b'', ''a'']

O

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


def reverse(spam): k = [] for i in spam: k.insert(0,i) return "".join(k)


input_list = [''foo'',''bar'',''baz''] for i in range(-1,-len(input_list)-1,-1) print(input_list[i])

Creo que esta es también una forma simple de hacerlo ... lea desde el final y siga disminuyendo hasta la longitud de la lista, ya que nunca ejecutamos el índice "final", por lo tanto, se agrega -1 también