Цикл назад, используя индексы в Python?

286

Я пытаюсь зациклить от 100 до 0. Как мне сделать это в Python?

for i in range (100,0) не работает

Джоан Венге
источник
9
Кстати, вы, вероятно, хотите зациклить от 99 до 0 и редко от 100 до 0. Это влияет на ответы.
Acumenus
1
@Acumenus Это было именно то, что я искал, когда достиг здесь. И для range(100)[::-1]range(9, -1, -1)
Хасан

Ответы:

399

Попробуйте range(100,-1,-1), 3-й аргумент - это приращение для использования (задокументировано здесь ).

(варианты «диапазона», запуск, остановка, шаг описаны здесь )

0x6adb015
источник
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.
Musiphil
1
xrange () больше не доступен в Python 3
Крис Граф
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]
kcwu
источник
16

Обычно в Python вы можете использовать отрицательные индексы, чтобы начать со спины:

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

Результат:

50
40
30
20
10
Blixt
источник
8

Почему ваш код не работает

Вы код for i in range (100, 0)в порядке, кроме

третий параметр ( step) по умолчанию +1. Таким образом, вы должны указать третий параметр для 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)
mythicalcoder
источник
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)
enoted
источник
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
pnoob
источник
0

Я попытался сделать это в одном из упражнений codeacademy (реверсирование символов в строке без использования обращения, ни :: -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
Boomba
источник
Добро пожаловать в стек переполнения! Пожалуйста, рассмотрите возможность редактирования своего поста, чтобы добавить больше объяснения о том, что делает ваш код и почему это решит проблему. Ответ, который в основном содержит только код (даже если он работает), обычно не помогает ОП понять их проблему.
SuperBiasedMan,
Вы понимаете, что использование sortedненужно будет хранить весь список в памяти, верно? Это расточительно и неосуществимо для больших a.
Acumenus