Обход списка в обратном порядке в Python - PullRequest
593 голосов
/ 09 февраля 2009

Так что я могу начать с len(collection) и оканчиваться на collection[0].

РЕДАКТИРОВАТЬ: Извините, я забыл упомянуть, я также хочу иметь возможность доступа к индексу цикла.

Ответы [ 27 ]

2 голосов
/ 27 февраля 2017

для чего бы то ни было, ты тоже можешь сделать это так. очень просто.

a = [1, 2, 3, 4, 5, 6, 7]
for x in xrange(len(a)):
    x += 1
    print a[-x]
2 голосов
/ 25 апреля 2014
def reverse(spam):
    k = []
    for i in spam:
        k.insert(0,i)
    return "".join(k)
1 голос
/ 27 июля 2013

Другие ответы хороши, но если вы хотите сделать как Стиль понимания списка

collection = ['a','b','c']
[item for item in reversed( collection ) ]
1 голос
/ 11 марта 2019
a = ["foo", "bar", "baz"]
print a[::~0]

еще один способ решения этой проблемы, этот код запускается декрементированным для цикла

1 голос
/ 28 февраля 2014

использовать встроенную функцию reversed() для объекта последовательности, этот метод влияет на все последовательности

более подробная ссылка

1 голос
/ 26 ноября 2017

Вы можете использовать отрицательный индекс в обычном цикле for:

>>> collection = ["ham", "spam", "eggs", "baked beans"]
>>> for i in range(1, len(collection) + 1):
...     print(collection[-i])
... 
baked beans
eggs
spam
ham

Чтобы получить доступ к индексу, как если бы вы выполняли итерацию вперед по обращенной копии коллекции, используйте i - 1:

>>> for i in range(1, len(collection) + 1):
...     print(i-1, collection[-i])
... 
0 baked beans
1 eggs
2 spam
3 ham

Чтобы получить доступ к исходному, не обращенному индексу, используйте len(collection) - i:

>>> for i in range(1, len(collection) + 1):
...     print(len(collection)-i, collection[-i])
... 
3 baked beans
2 eggs
1 spam
0 ham
1 голос
/ 27 июля 2016

Вы также можете использовать цикл while:

i = len(collection)-1
while i>=0:
    value = collection[i]
    index = i
    i-=1
1 голос
/ 06 сентября 2018

Если вам нужен индекс, а ваш список небольшой, самый читаемый способ - сделать reversed(list(enumerate(your_list))), как сказано в принятом ответе. Но это создает копию вашего списка, поэтому, если ваш список занимает большую часть вашей памяти, вам придется вычесть индекс, возвращаемый enumerate(reversed()) из len()-1.

Если вам нужно сделать это один раз:

a = ['b', 'd', 'c', 'a']

for index, value in enumerate(reversed(a)):
    index = len(a)-1 - index

    do_something(index, value)

или если вам нужно сделать это несколько раз, вы должны использовать генератор:

def enumerate_reversed(lyst):
    for index, value in enumerate(reversed(lyst)):
        index = len(lyst)-1 - index
        yield index, value

for index, value in enumerate_reversed(a):
    do_something(index, value)
1 голос
/ 06 декабря 2016

Простой подход:

for i in range(1,len(arr)+1):
    print(arr[-i])
1 голос
/ 14 июля 2018

Выразительный способ достижения reverse(enumerate(collection)) в Python 3:

zip(reversed(range(len(collection))), reversed(collection))

в питоне 2:

izip(reversed(xrange(len(collection))), reversed(collection))

Я не уверен, почему у нас нет сокращения для этого, например .:

def reversed_enumerate(collection):
    return zip(reversed(range(len(collection))), reversed(collection))

или почему у нас нет reversed_range()

...