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

Joan Venge
fonte
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 )

0x6adb015
fonte
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,
Tríptico
fonte
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]
kcwu
fonte
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
Blixt
fonte
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)
mythicalcoder
fonte
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.

Andy T.
fonte
3

A resposta simples para resolver seu problema pode ser assim:

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

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

user2220115
fonte
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    
Mike
fonte
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
pnoob
fonte
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')
tábua rasa
fonte
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
Emanuel Lindström
fonte
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])
Darrell
fonte
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
mohammed wazeem
fonte
-2
a = 10
for i in sorted(range(a), reverse=True):
    print i
boomba
fonte
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