Pętla wstecz przy użyciu indeksów w Pythonie?

286

Próbuję zapętlić od 100 do 0. Jak to zrobić w Pythonie?

for i in range (100,0) nie działa

Joan Venge
źródło
9
BTW, prawdopodobnie chcesz zapętlić od 99 do 0, a rzadko od 100 do 0. To wpływa na odpowiedzi.
Acumenus,
1
@Acumenus Właśnie tego szukałem po dotarciu tutaj. Dla przypomnienia, rozwiązaniem jest po prostu napisanie: range(100)[::-1](co jest automatycznie tłumaczone range(9, -1, -1)) - Testowane w pythonie 3.7
Hassan

Odpowiedzi:

399

Spróbuj range(100,-1,-1), trzeci argument to przyrost użycia (udokumentowany tutaj ).

(opcje „zakres”, start, stop, krok są udokumentowane tutaj )

0x6adb015
źródło
3
Muszę również użyć tego, aby usunąć elementy z kolekcji, dlatego właśnie chciałem indeksów.
Joan Venge
2
drugi argument jest o jeden mniejszy niż wartość końcowa. więc jeśli umieścisz -1, to zakres zatrzyma się na 0, jeśli umieścisz -5, zakres zatrzyma się na -4 (dla przyrostu -1)
Mulllhausen
200

Moim zdaniem jest to najbardziej czytelny:

for i in reversed(xrange(101)):
    print i,
Tryptyk
źródło
14
Jest to lepsze niż zaakceptowana odpowiedź, ponieważ w rzeczywistości nie przydziela wszystkich liczb w pamięci (w Pythonie 3 zaakceptowana odpowiedź też nie), a ponadto jest bardziej oczywiste, co się dzieje.
Blixt
5
Python przed wersją 2.6 nie przydziela wszystkich liczb, ponieważ odwrócone nie ma sposobu, aby xrange cofnął się ... (Od Python 2.6 wywołuje __reversed __ ().)
Robert Siemer
Wolę reversed(xrange(len(list)))się xrange(len(list)-1:-1:-1); ten ostatni wygląda dziwnie z tyloma -1.
musiphil
1
xrange () nie jest już dostępny w Pythonie 3
Chris Graf,
1
W Python 3 rangezachowuje się tak samo jakxrange w 2.7. @ hacksoi zależy od przypadku użycia, ale powiedzmy, że iterujesz wstecz w dużym buforze, powiedzmy, że to 10 MB, a następnie utworzenie wcześniejszych indeksów zajmie kilka sekund i zużyje ponad 50 MB pamięci. Użycie odwróconego generatora zajmie milisekundy i zużyje tylko kilka bajtów pamięci.
Blixt,
34
for i in range(100, -1, -1)

i niektóre nieco dłuższe (i wolniejsze) rozwiązanie:

for i in reversed(range(101))

for i in range(101)[::-1]
kcwu
źródło
16

Ogólnie w Pythonie można używać indeksów ujemnych, aby rozpocząć od tyłu:

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

Wynik:

50
40
30
20
10
Blixt
źródło
8

Dlaczego twój kod nie działał

Twój kod for i in range (100, 0)jest w porządku, z wyjątkiem

trzeci parametr ( step) jest domyślnie +1. Musisz więc podać trzeci parametr do range () jako -1krok wstecz.

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

UWAGA: Obejmuje to 100 i 0 na wyjściu.

Istnieje wiele sposobów.

Lepszy sposób

W przypadku pythonicznego sposobu sprawdź PEP 0322 .

To jest pythonowy przykład Pythona do drukowania od 100 do 0 (w tym 100 i 0).

for i in reversed(range(101)):
    print(i)
mityczny koder
źródło
1
tak, PEP-322 daje nam jasny i najmniej podatny na błędy sposób na odwrócenie iteracji.
Allen Shen
1
To jest dobre. Zalecenie dotyczące sposobu implementacji reversedw PEP-322 jest mylące, dlatego należy zauważyć, że reversedwywoła __reversed__iterowalny i zwróci wynik, a dla rangeobiektów jest to leniwy oceniany range_objectiterator. W skrócie: korzystanie z tej metody jest nadal leniwą oceną.
Ruzihm
5

Inne rozwiązanie:

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

Wynik:

10
9
8
7
6
5
4
3
2
1

Wskazówka: Jeśli używasz tej metody do odliczania indeksów na liście, będziesz chciał -1 od wartości „y”, ponieważ indeksy listy zaczną się od 0.

Andy T.
źródło
3

Prosta odpowiedź na rozwiązanie problemu może wyglądać następująco:

for i in range(100):
    k = 100 - i
    print(k)
przywołany
źródło
1

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

użytkownik2220115
źródło
1

Krótkie i słodkie. To było moje rozwiązanie podczas kursu CodeAcademy. Drukuje ciąg w kolejności rev.

def reverse(text):
    string = ""
    for i in range(len(text)-1,-1,-1):
        string += text[i]
    return string    
Mikrofon
źródło
1

Zawsze możesz zwiększyć zakres i odjąć od zmiennej w twoim przypadku, w 100 - iktórym i in range( 0, 101 ).

for i in range( 0, 101 ):
    print 100 - i
pnoob
źródło
0

Próbowałem tego w jednym z ćwiczeń w codeacademy (odwracanie znaków w ciągu bez użycia odwróconego ani :: -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
źródło
0

Chciałem jednocześnie przeglądać dwie listy wstecz, więc potrzebowałem indeksu ujemnego. To jest moje rozwiązanie:

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

Wynik:

-1 2
-2 5
-3 4
-4 3
-5 1
Emanuel Lindström
źródło
0

No dobrze, źle przeczytaj pytanie. Chyba chodzi o cofanie się w tablicy? jeśli tak, mam to:

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
źródło
Wygląda na to, że twoją odpowiedzią jest wklej kopię wykonanego testu. Spróbuj opublikować minimalny przykład: użycie globali timenie ma znaczenia dla pierwszego pytania.
Michael Doubez
-1

Możesz również utworzyć niestandardowy mechanizm odwrotny w Pythonie. Którego można używać w dowolnym miejscu do zapętlania iterowalnego wstecz

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
źródło
-2
a = 10
for i in sorted(range(a), reverse=True):
    print i
boomba
źródło
Witamy w Stack Overflow! Rozważ edycję swojego posta, aby dodać więcej wyjaśnień na temat tego, co robi Twój kod i dlaczego rozwiąże problem. Odpowiedź, która w większości zawiera tylko kod (nawet jeśli działa), zwykle nie pomaga OP zrozumieć jego problemu.
SuperBiasedMan
Zdajesz sobie sprawę, że używanie sortedniepotrzebnie zapisze całą listę w pamięci, prawda? Jest to marnotrawstwo i nie jest wykonalne dla dużych a.
Acumenus,