Так что я могу начать с len(collection)
и до конца collection[0]
.
Я также хочу иметь возможность доступа к индексу цикла.
Используйте встроенную reversed()
функцию:
>>> a = ["foo", "bar", "baz"]
>>> for i in reversed(a):
... print(i)
...
baz
bar
foo
Чтобы также получить доступ к исходному индексу, используйте его enumerate()
в своем списке, прежде чем передавать его по адресу reversed()
:
>>> for i, e in reversed(list(enumerate(a))):
... print(i, e)
...
2 baz
1 bar
0 foo
Так как enumerate()
возвращает генератор и генераторы не могут быть отменены, вам необходимо преобразовать его в list
первый.
reversed()
не изменять список.reversed()
не делает копию списка (иначе это потребовало бы O (N) дополнительной памяти). Если вам нужно изменить список, используйтеalist.reverse()
; если вам нужна копия списка в обратном порядке, используйтеalist[::-1]
.Ты можешь сделать:
(Или все, что вы хотите сделать в цикле for.)
[::-1]
Ломтика переворачивает список в цикле для (но не будет на самом деле изменить свой список «постоянно»).источник
[::-1]
создает поверхностную копию, поэтому не меняет массив ни «постоянно», ни «временно».0
, вероятно-1
, таким образом, заканчивается при запуске ) и шаг :-1
(повторяется в обратном порядке по списку,1
элементу за раз).reversed()
Если вам нужен индекс цикла и вы не хотите дважды просматривать весь список или использовать дополнительную память, я бы написал генератор.
источник
reversed(xrange(len(L)))
производит те же индексы, что иxrange(len(L)-1, -1, -1)
.for index, item in enumerate(reversed(L)): print len(L)-1-index, item
Это можно сделать так:
Итак, ваше предположение было довольно близко :) Немного неловко, но в основном говорится: начните с 1 меньше
len(collection)
, продолжайте, пока не доберетесь до -1, с шагом -1.Кстати, эта
help
функция очень полезна, поскольку позволяет просматривать документы для чего-либо из консоли Python, например:help(range)
источник
-1
. Я бы просто сказалreversed(xrange(len(collection)))
reversed
Функция встроенной удобно:Документация для обращенно объясняет свои ограничения.
Для случаев, когда мне нужно пройти последовательность в обратном порядке вместе с индексом (например, для модификаций на месте, изменяющих длину последовательности), я определил эту функцию для моего модуля codeutil:
Этот избегает создания копии последовательности. Очевидно, что
reversed
ограничения по-прежнему применяются.источник
Как насчет без воссоздания нового списка, вы можете сделать это путем индексации:
ИЛИ
источник
ИЛИ
источник
Мне нравится однострочный генератор:
источник
Кроме того, вы можете использовать функции «range» или «count». Следующее:
Вы также можете использовать «count» из itertools следующим образом:
источник
3 foo\n2 bar\n1 baz
Используйте,
list.reverse()
а затем повторяйте, как обычно.http://docs.python.org/tutorial/datastructures.html
источник
Подход без импорта:
или
источник
источник
что бы это ни стоило, ты тоже можешь сделать это так. очень просто.
источник
print a[-(x+1)]
избегать переназначения индекса в теле цикла.Выразительный способ достичь
reverse(enumerate(collection))
в Python 3:в питоне 2:
Я не уверен, почему у нас нет сокращения для этого, например:
или почему у нас нет
reversed_range()
источник
Если вам нужен индекс, а ваш список невелик, самый читаемый способ - поступить так,
reversed(list(enumerate(your_list)))
как говорится в принятом ответе. Но это создает копию вашего списка, поэтому, если ваш список занимает большую часть вашей памяти, вам придется вычесть индекс, возвращаемыйenumerate(reversed())
изlen()-1
.Если вам просто нужно сделать это один раз:
или если вам нужно сделать это несколько раз, вы должны использовать генератор:
источник
обратная функция пригодится здесь:
источник
Вы также можете использовать
while
цикл:источник
Вы можете использовать отрицательный индекс в обычном цикле for:
Чтобы получить доступ к индексу, как будто вы перебираете перевернутую копию коллекции, используйте
i - 1
:Чтобы получить доступ к исходному необратимому индексу, используйте
len(collection) - i
:источник
Если вы не возражаете против отрицательного индекса, вы можете сделать:
источник
Я думаю, что самый элегантный способ трансформировать
enumerate
иreversed
использовать следующий генераторкоторый генерирует обратную
enumerate
итераторПример:
Результат:
источник
Другие ответы хороши, но если вы хотите сделать как стиль понимания списка
источник
Чтобы использовать отрицательные индексы: начните с -1 и отступайте на -1 на каждой итерации.
источник
Простой способ:
источник
я думаю, что это также простой способ сделать это ... читать с конца и продолжать уменьшаться до длины списка, так как мы никогда не выполняем индекс "конца", следовательно добавляем -1 также
источник
Предполагая, что задача состоит в том, чтобы найти последний элемент, который удовлетворяет некоторому условию в списке (то есть сначала, если смотреть назад), я получаю следующие числа:
Итак, самый уродливый вариант
xrange(len(xs)-1,-1,-1)
- самый быстрый.источник
Вы можете использовать генератор:
наконец-то:
надеюсь, это поможет вам.
источник