Цикл назад за допомогою індексів у Python?


286

Я намагаюся перевести цикл від 100 до 0. Як це зробити в Python?

for i in range (100,0) не працює.


9
До речі, ви, мабуть, хочете перевести цикл від 99 до 0, а рідко від 100 до 0. Це впливає на відповіді.
— Акумен

1
@Acumenus Це саме те, що я шукав, коли доїхав сюди. А для запису рішення - просто написати: range(100)[::-1](що автоматично перекладається на range(9, -1, -1)) - Тестовано на python 3.7
— Хассан

Відповіді:


399

Спробуйте range(100,-1,-1), третій аргумент - це приріст для використання ( тут задокументовано ).

(Параметри "діапазону", початок, зупинка, крок задокументовані тут )


3
Також мені потрібно використовувати це для видалення предметів із колекції, тому саме так хотілися індекси.
— Джоан Венге

2
другий аргумент на один менший, ніж кінцеве значення. тож якщо ви ставите -1, то діапазон зупиняється на 0, якщо ви ставите -5, то діапазон зупиняється на -4 (з кроком до -1)
— mulllhausen

200

На мою думку, це найчитабельніше:

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

14
Це краще, ніж прийнята відповідь, оскільки вона насправді не розподіляє всі числа в пам'яті (у Python 3 також не буде прийнятої відповіді), плюс це очевидно, що відбувається.
— Blixt

5
Python до 2.6 не виділяє всі числа, тому що перевернутий не має ніякого способу сказати xrange йти назад ... (З Python 2.6 він називає __reversed __ ().)
— Роберт Сімер

Я вважаю reversed(xrange(len(list)))за краще xrange(len(list)-1:-1:-1); останній просто дивно виглядає з такою кількістю -1's.
— musiphil

1
xrange () більше не доступний у Python 3
— Chris Graf

1
У Python 3 rangeповодиться так само, як xrangeі в 2.7. @hacksoi залежить від випадку використання, але скажімо, що ви повторюєте велике буферне обертання, скажімо, це 10 Мб, тоді створення зворотних індексів наперед зайняло б секунди і зайняло понад 50 Мб пам'яті. Використання зворотного генератора зайняло б мілісекунди і зайняло б лише кілька байт пам'яті.
— Blixt

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

і дещо довше (і повільніше) рішення:

for i in reversed(range(101))

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

16

Як правило, в Python ви можете використовувати негативні індекси для початку зі зворотної сторони:

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

Результат:

50
40
30
20
10

8

Чому ваш код не працював

У вас код for i in range (100, 0)добре, за винятком

третій параметр ( step) за замовчуванням +1. Отже, вам слід вказати 3-й параметр to range () як -1крок назад.

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

ПРИМІТКА. Це включає 100 і 0 у виході.

Існує кілька способів.

Кращий шлях

Для пітонічного способу перевірте PEP 0322 .

Це пітонічний приклад Python3 для друку від 100 до 0 (включаючи 100 і 0).

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

1
так, PEP-322 дає нам чіткий і найменш схильний до помилок спосіб повернення ітерацій.
— Аллен Шен

1
Це добре. Рекомендація, як реалізувати reversedв PEP-322, вводить в оману, тому слід зауважити, що reversedбуде закликати __reversed__ітерабельний і повернути результат, а для rangeоб'єктів це ілюратор, який оцінюється ледачим range_object. Коротше кажучи: використання цього методу все ще лінива оцінка.
— Рузімм

5

Ще одне рішення:

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

Результат:

10
9
8
7
6
5
4
3
2
1

Порада: Якщо ви використовуєте цей метод для підрахунку індексів у списку, вам буде потрібно -1 від значення "y", оскільки ваші списки індексу почнуться з 0.


3

Проста відповідь для вирішення вашої проблеми могла бути такою:

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


1

Короткий і солодкий. Це було моє рішення при проведенні курсу codeAcademy. Друкує рядок у порядку обертання.

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

1

Ви завжди можете збільшувати діапазон і віднімати від змінної у вашому випадку 100 - iде i in range( 0, 101 ).

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

0

Я спробував це в одному з вправ з кодекодемією (реверсування символів у рядку, не використовуючи перевернутого nor :: -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

Мені хотілося одночасно пропустити два списки назад, тому мені знадобився негативний індекс. Це моє рішення:

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

Результат:

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

0

Ну добре, прочитайте питання неправильно, я думаю, мова йде про те, щоб повернутися назад у масиві? якщо так, я маю це:

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та timeне стосується первинного питання.
— Майкл Дубез

-1

Ви також можете створити спеціальний механізм зворотного зв’язку в python. Що можна використовувати в будь-якому місці для циклічного перегляду назад

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

Ласкаво просимо до переповнення стека! Будь ласка, подумайте про редагування своєї публікації, щоб додати більше пояснень щодо того, що робить ваш код і чому це вирішить проблему. Відповідь, що здебільшого просто містить код (навіть якщо він працює), зазвичай не допомагає ОП зрозуміти свою проблему.
— SuperBiasedMan

Ви розумієте, що використання sortedне потребує зберігання всього списку в пам’яті, правда? Це марно і не можливо для великих a.
— Acumenus
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.