Ripeti indietro usando gli indici in Python?


286

Sto cercando di eseguire il loop da 100 a 0. Come posso farlo in Python?

for i in range (100,0) non funziona


9
A proposito, probabilmente vuoi passare da 99 a 0 e raramente da 100 a 0. Ciò influisce sulle risposte.
Acumenus,

1
@Acumenus Era esattamente quello che cercavo quando sono arrivato qui. E per la cronaca, la soluzione è semplicemente scrivere: range(100)[::-1](che viene tradotto automaticamente in range(9, -1, -1)) - Testato in python 3.7
Hassan

Risposte:


399

Prova range(100,-1,-1), il terzo argomento è l'incremento da usare (documentato qui ).

(le opzioni "intervallo", start, stop, step sono documentate qui )


3
Inoltre ho bisogno di usare questo per eliminare elementi dalla raccolta, quindi è per questo che volevo solo gli indici.
Joan Venge,

2
il secondo argomento è uno in meno del valore finale. quindi se metti -1 allora l'intervallo si ferma a 0, se metti -5, l'intervallo si ferma a -4 (per un incremento di -1)
mulllhausen

200

Secondo me, questo è il più leggibile:

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

14
Questo è meglio della risposta accettata poiché in realtà non alloca tutti i numeri in memoria (neanche in Python 3 la risposta accettata lo farebbe), inoltre è più ovvio ciò che sta accadendo.
Blixt,

5
Python prima della 2.6 alloca tutti i numeri, perché invertito non ha modo di dire allo xrange di tornare indietro ... (Da Python 2.6 chiama __reversed __ ().)
Robert Siemer,

Io preferisco reversed(xrange(len(list)))a xrange(len(list)-1:-1:-1); il secondo sembra strano con così tanti -1.
musiphil,

1
xrange () non è più disponibile in Python 3
Chris Graf

1
In Python 3, rangesi comporta come xrangenella 2.7. @hacksoi dipende dal caso d'uso, ma supponiamo che tu stia iterando all'indietro in un buffer di grandi dimensioni, diciamo che è 10 MB, quindi la creazione iniziale degli indici inversi richiederebbe secondi e consumerebbe oltre 50 MB di memoria. L'uso di un generatore inverso richiederebbe millisecondi e consumerebbe solo pochi byte di memoria.
Blixt,

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

e qualche soluzione leggermente più lunga (e più lenta):

for i in reversed(range(101))

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

16

Generalmente in Python, puoi usare indici negativi per iniziare dal retro:

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

Risultato:

50
40
30
20
10

8

Perché il tuo codice non ha funzionato

Il codice for i in range (100, 0)va bene, tranne

il terzo parametro ( step) è di default +1. Quindi devi specificare il 3o parametro su range () per -1fare un passo indietro.

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

NOTA: questo include 100 e 0 nell'output.

Ci sono molti modi.

Modo migliore

Per la via pitonica, controlla PEP 0322 .

Questo è l'esempio pythonic di Python3 per stampare da 100 a 0 (inclusi 100 e 0).

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

1
sì, PEP-322 ci offre un modo chiaro e meno soggetto a errori per invertire le iterazioni.
Allen Shen,

1
Questo è buono. La raccomandazione su come implementare reversedin PEP-322 è fuorviante, quindi va notato che reversedchiamerà __reversed__l'iterabile e restituirà il risultato, e per gli rangeoggetti questo è un pigro range_objectiteratore valutato . In breve: usare questo metodo è ancora una valutazione pigra.
Ruzihm,

5

Un'altra soluzione:

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

Risultato:

10
9
8
7
6
5
4
3
2
1

Suggerimento: se si utilizza questo metodo per contare gli indici in un elenco, sarà necessario -1 dal valore 'y', poiché gli indici dell'elenco inizieranno da 0.


3

La semplice risposta per risolvere il tuo problema potrebbe essere questa:

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


1

Breve e dolce Questa era la mia soluzione quando facevo il corso codeAcademy. Stampa una stringa in ordine di giro.

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

1

Puoi sempre aumentare l'intervallo e sottrarre una variabile nel tuo caso in 100 - icui i in range( 0, 101 ).

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

0

Ho provato questo in uno degli esercizi di codeacademy (invertire i caratteri in una stringa senza usare reversed né :: -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

Volevo scorrere indietro di due liste contemporaneamente, quindi avevo bisogno dell'indice negativo. Questa è la mia soluzione:

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

Risultato:

-1 2
-2 5
-3 4
-4 3
-5 1

0

Oh okay, leggi la domanda sbagliata, immagino si tratti di tornare indietro in un array? in tal caso, ho questo:

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

Sembra che la tua risposta sia la copia incolla del test che hai effettuato. Prova a pubblicare un esempio minimo: l'uso di globale timenon è rilevante per la domanda iniziale.
Michael Doubez,

-1

Puoi anche creare un meccanismo inverso personalizzato in Python. Che può essere utilizzato ovunque per il looping di un iterabile all'indietro

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

Benvenuto in Stack Overflow! Ti consigliamo di modificare il tuo post per aggiungere ulteriori spiegazioni su ciò che fa il tuo codice e sul perché risolverà il problema. Una risposta che per lo più contiene solo codice (anche se funziona) di solito non aiuta l'OP a capire il loro problema.
SuperBiasedMan,

Ti rendi conto che l'utilizzo sortedmemorizzerà inutilmente l'intero elenco in memoria, giusto? Questo è uno spreco e non è fattibile per grandi a.
Acumenus,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.