Цикл назад за допомогою індексів у 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.