Estou tentando fazer um loop de 100 a 0. Como faço isso em Python?
for i in range (100,0)
não funciona
range(100)[::-1]
(que é traduzido automaticamente para range(9, -1, -1)
) - Testado em python 3.7
Estou tentando fazer um loop de 100 a 0. Como faço isso em Python?
for i in range (100,0)
não funciona
range(100)[::-1]
(que é traduzido automaticamente para range(9, -1, -1)
) - Testado em python 3.7
Respostas:
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 )
Na minha opinião, este é o mais legível:
for i in reversed(xrange(101)):
print i,
reversed(xrange(len(list)))
a xrange(len(list)-1:-1:-1)
; o último parece estranho com tantos -1
.
range
se comporta da mesma maneira xrange
que 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.
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 -1
retroceder.
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)
reversed
no PEP-322 é enganosa, por isso deve-se notar que reversed
chamará __reversed__
na iterable e retornar o resultado, e por range
objetos este é um preguiçoso avaliadas range_object
iterador. Em resumo: o uso desse método ainda é uma avaliação preguiçosa.
for var in range(10,-1,-1)
trabalho
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')
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
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])
global
e time
não é relevante para a pergunta inicial.
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
a = 10
for i in sorted(range(a), reverse=True):
print i
sorted
desnecessariamente armazena a lista inteira na memória, certo? Isso é um desperdício e não é viável para grandes a
.