Loop para trás usando índices em Python?


286

Estou tentando fazer um loop de 100 a 0. Como faço isso em Python?

for i in range (100,0) não funciona


9
BTW, você provavelmente deseja fazer um loop de 99 a 0 e raramente de 100 a 0. Isso afeta as respostas.
Acumenus

1
@ Acumenus Isso foi exatamente o que eu procurei quando chegou aqui. E, para o registro, a solução é simplesmente escrever: range(100)[::-1](que é traduzido automaticamente para range(9, -1, -1)) - Testado em python 3.7
Hassan

Respostas:


399

Tente range(100,-1,-1), o terceiro argumento sendo o incremento a ser usado (documentado aqui ).

(as opções "range", start, stop, step estão documentadas aqui )


3
Também preciso usar isso para excluir itens da coleção, e é por isso que só queria os índices.
Joan Venge 15/05

2
o segundo argumento é um a menos que o valor final. assim se colocar -1 então o intervalo de pára a 0, se colocar -5, a gama pára a -4 (para um incremento de -1)
mulllhausen

200

Na minha opinião, este é o mais legível:

for i in reversed(xrange(101)):
    print i,

14
Isso é melhor do que a resposta aceita, pois na verdade não aloca todos os números na memória (no Python 3 a resposta aceita também não), além de ser mais óbvio o que está acontecendo.
Blixt 23/03/12

5
Python antes de 2.6 aloca todos os números, porque reversa não tem nenhuma maneira de dizer o xrange para ir para trás ... (Desde Python 2.6 que chama __reversed __ ().)
Robert Siemer

Eu prefiro reversed(xrange(len(list)))a xrange(len(list)-1:-1:-1); o último parece estranho com tantos -1.
Musiphil

1
O xrange () não está mais disponível no Python 3 #
Chris Graf

1
No Python 3, rangese comporta da mesma maneira xrangeque no 2.7. O @hacksoi depende do caso de uso, mas digamos que você esteja iterando para trás em um buffer grande, digamos que seja 10 MB; em seguida, criar os índices reversos antecipadamente levaria segundos e consumiria mais de 50 MB de memória. Usar um gerador invertido levaria milissegundos e consumiria apenas alguns bytes de memória.
Blixt

34
for i in range(100, -1, -1)

e alguma solução um pouco mais longa (e mais lenta):

for i in reversed(range(101))

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

16

Geralmente no Python, você pode usar índices negativos para começar do início:

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

Resultado:

50
40
30
20
10

8

Por que seu código não funcionou

Seu código for i in range (100, 0)está bom, exceto

o terceiro parâmetro ( step) é por padrão +1. Portanto, você deve especificar o terceiro parâmetro para range () e -1retroceder.

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

NOTA: Isso inclui 100 e 0 na saída.

Existem várias maneiras.

Melhor maneira

Para uma maneira python, verifique PEP 0322 .

Este é um exemplo python do Python3 para imprimir de 100 a 0 (incluindo 100 e 0).

for i in reversed(range(101)):
    print(i)

1
sim, o PEP-322 nos fornece uma maneira clara e menos propensa a erros de reverter iterações.
Allen Shen

1
Isso é bom. A recomendação de como implementar reversedno PEP-322 é enganosa, por isso deve-se notar que reversedchamará __reversed__na iterable e retornar o resultado, e por rangeobjetos este é um preguiçoso avaliadas range_objectiterador. Em resumo: o uso desse método ainda é uma avaliação preguiçosa.
Ruzihm

5

Outra solução:

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

Resultado:

10
9
8
7
6
5
4
3
2
1

Dica: Se você estiver usando esse método para contar índices em uma lista, convém -1 do valor 'y', pois os índices da lista começarão em 0.


3

A resposta simples para resolver seu problema pode ser assim:

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


1

Curto e grosso. Esta foi a minha solução ao fazer o curso codeAcademy. Imprime uma sequência em ordem de rotação.

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

1

Você sempre pode aumentar o alcance e subtrair de uma variável no seu caso 100 - ionde i in range( 0, 101 ).

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

0

Eu tentei isso em um dos exercícios da codeacademy (reverter chars em uma string sem usar reversed nem :: -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')

0

Eu queria percorrer duas listas ao mesmo tempo para trás, então precisava do índice negativo. Esta é a minha solução:

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

0

Ah, ok, leia a pergunta errada, acho que é sobre retroceder em uma matriz? Se sim, eu tenho o seguinte:

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

Parece que sua resposta é a pasta de cópia do teste que você fez. Por favor, tente postar um exemplo mínimo: o uso de globale timenão é relevante para a pergunta inicial.
Michael Doubez 27/05/19

-1

Você também pode criar um mecanismo reverso personalizado em python. Que pode ser usado em qualquer lugar para fazer um loop iterável para trá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

-2
a = 10
for i in sorted(range(a), reverse=True):
    print i

Bem-vindo ao Stack Overflow! Considere editar sua postagem para adicionar mais explicações sobre o que seu código faz e por que ele resolverá o problema. Uma resposta que geralmente contém apenas código (mesmo que esteja funcionando) geralmente não ajuda o OP a entender seu problema.
SuperBiasedMan

Você percebe que o uso sorteddesnecessariamente armazena a lista inteira na memória, certo? Isso é um desperdício e não é viável para grandes a.
Acumenus
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.