¿Recorrer hacia atrás usando índices en Python?

286

Estoy tratando de pasar de 100 a 0. ¿Cómo hago esto en Python?

for i in range (100,0) no funciona

Joan Venge
fuente
9
Por cierto, es probable que desee pasar de 99 a 0, y rara vez de 100 a 0. Esto afecta las respuestas.
Acumenus
1
@Acumenus Eso fue exactamente lo que busqué cuando llegué aquí. Y para el registro, la solución es simplemente escribir: range(100)[::-1](que se traduce automáticamente a range(9, -1, -1)) - Probado en Python 3.7
Hassan

Respuestas:

399

Intente range(100,-1,-1), el tercer argumento es el incremento a usar (documentado aquí ).

(las opciones de "rango", inicio, parada, paso se documentan aquí )

0x6adb015
fuente
3
También necesito usar esto para eliminar elementos de la colección, por eso solo quería los índices.
Joan Venge
2
El segundo argumento es uno menos que el valor final. así que si pones -1, el rango se detiene en 0, si pones -5, el rango se detiene en -4 (para un incremento de -1)
mulllhausen
200

En mi opinión, este es el más legible:

for i in reversed(xrange(101)):
    print i,
Tríptico
fuente
14
Esto es mejor que la respuesta aceptada, ya que en realidad no asigna todos los números en la memoria (en Python 3 la respuesta aceptada tampoco), además es más obvio lo que está sucediendo.
Blixt
55
Python antes de 2.6 asigna todos los números, porque invertido no tiene forma de decirle al xrange que retroceda ... (Desde Python 2.6 llama __reversed __ ().)
Robert Siemer
Yo prefiero reversed(xrange(len(list)))a xrange(len(list)-1:-1:-1); este último se ve raro con tantos -1.
musiphil
1
xrange () ya no está disponible en Python 3
Chris Graf el
1
En Python 3, se rangecomporta de la misma manera xrangeque en 2.7. @hacksoi depende del caso de uso, pero digamos que está iterando hacia atrás en un búfer grande, digamos que son 10 MB, luego crear los índices inversos por adelantado tomaría segundos y usaría más de 50 MB de memoria. Usar un generador invertido tomaría milisegundos y solo usaría unos pocos bytes de memoria.
Blixt
34
for i in range(100, -1, -1)

y alguna solución un poco más larga (y más lenta):

for i in reversed(range(101))

for i in range(101)[::-1]
kcwu
fuente
16

Generalmente en Python, puede usar índices negativos para comenzar desde atrás:

numbers = [10, 20, 30, 40, 50]
for i in xrange(len(numbers)):
    print numbers[-i - 1]

Resultado:

50
40
30
20
10
Blixt
fuente
8

Por qué su código no funcionó

Tu código for i in range (100, 0)está bien, excepto

El tercer parámetro ( step) es por defecto +1. Por lo tanto, debe especificar el tercer parámetro para range () como -1para retroceder.

for i in range(100, -1, -1):
    print(i)

NOTA: Esto incluye 100 y 0 en la salida.

Hay múltiples formas

Mejor manera

Para la forma pitónica, consulte PEP 0322 .

Este es un ejemplo de Python3 para imprimir de 100 a 0 (incluyendo 100 y 0).

for i in reversed(range(101)):
    print(i)
codificador mítico
fuente
1
sí, PEP-322 nos brinda una forma clara y menos propensa a errores para revertir las iteraciones.
Allen Shen
1
Esto es bueno. La recomendación de cómo implementar reverseden PEP-322 es engañosa, por lo que debe tenerse en cuenta que reversedrecurrirá __reversed__al iterable y devolverá el resultado, y para los rangeobjetos este es un range_objectiterador evaluado perezoso . En resumen: el uso de este método sigue siendo una evaluación perezosa.
Ruzihm
5

Otra solución:

z = 10
for x in range (z):
   y = z-x
   print y

Resultado:

10
9
8
7
6
5
4
3
2
1

Sugerencia: Si está utilizando este método para contar los índices en una lista, querrá -1 desde el valor 'y', ya que sus índices de lista comenzarán en 0.

Andy T.
fuente
3

La respuesta simple para resolver su problema podría ser así:

for i in range(100):
    k = 100 - i
    print(k)
enotado
fuente
1

for var in range(10,-1,-1) trabajos

usuario2220115
fuente
1

Corto y dulce. Esta fue mi solución al hacer el curso codeAcademy. Imprime una cadena en orden de revoluciones.

def reverse(text):
    string = ""
    for i in range(len(text)-1,-1,-1):
        string += text[i]
    return string    
Miguel
fuente
1

Siempre puede aumentar el rango y restar de una variable en su caso 100 - idonde i in range( 0, 101 ).

for i in range( 0, 101 ):
    print 100 - i
pnoob
fuente
0

Intenté esto en uno de los ejercicios de codeacademy (invertir caracteres en una cadena sin usar reverse ni :: -1)

def reverse(text):
    chars= []
    l = len(text)
    last = l-1
    for i in range (l):
        chars.append(text[last])
        last-=1

    result= ""   
    for c in chars:
        result += c
    return result
print reverse('hola')
Tabula Rasa
fuente
0

Quería recorrer dos listas hacia atrás al mismo tiempo, así que necesitaba el índice negativo. Esta es mi solución:

a= [1,3,4,5,2]
for i in range(-1, -len(a), -1):
    print(i, a[i])

Resultado:

-1 2
-2 5
-3 4
-4 3
-5 1
Emanuel Lindström
fuente
0

Oh bien, lee la pregunta mal, ¿supongo que se trata de retroceder en una matriz? si es así, tengo esto:

array = ["ty", "rogers", "smith", "davis", "tony", "jack", "john", "jill", "harry", "tom", "jane", "hilary", "jackson", "andrew", "george", "rachel"]


counter = 0   

for loop in range(len(array)):
    if loop <= len(array):
        counter = -1
        reverseEngineering = loop + counter
        print(array[reverseEngineering])
Darrell
fuente
Parece que su respuesta es copiar y pegar la prueba que realizó. Intente publicar un ejemplo mínimo: el uso de globaly timeno es relevante para la pregunta inicial.
Michael Doubez
-1

También puede crear un mecanismo inverso personalizado en python. Que se puede usar en cualquier lugar para recorrer un iterable hacia atrás

class Reverse:
    """Iterator for looping over a sequence backwards"""
    def __init__(self, seq):
        self.seq = seq
        self.index = len(seq)

    def __iter__(self):
        return self

    def __next__(self):
        if self.index == 0:
            raise StopIteration
        self.index -= 1
        return self.seq[self.index]


>>> d = [1,2,3,4,5]
>>> for i in Reverse(d):
...   print(i)
... 
5
4
3
2
1
Mohammed Wazeem
fuente
-2
a = 10
for i in sorted(range(a), reverse=True):
    print i
boomba
fuente
¡Bienvenido a Stack Overflow! Considere editar su publicación para agregar más explicaciones sobre lo que hace su código y por qué resolverá el problema. Una respuesta que en su mayoría solo contiene código (incluso si está funcionando) generalmente no ayudará al OP a comprender su problema.
SuperBiasedMan
Te das cuenta de que el uso sortedalmacenará innecesariamente toda la lista en la memoria, ¿verdad? Esto es un desperdicio y no es factible para grandes a.
Acumenus