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

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

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

Ответы [ 27 ]

0 голосов
/ 22 июля 2018
input_list = ['foo','bar','baz']
for i in range(-1,-len(input_list)-1,-1)
    print(input_list[i])

я думаю, что это также простой способ сделать это ... читать с конца и продолжать уменьшаться до длины списка, так как мы никогда не выполняем индекс "конца", следовательно добавляем -1 также

0 голосов
/ 11 сентября 2018

Предполагая, что задача состоит в том, чтобы найти последний элемент, который удовлетворяет некоторому условию в списке (то есть сначала при взгляде назад), я получаю следующие числа:

>>> min(timeit.repeat('for i in xrange(len(xs)-1,-1,-1):\n    if 128 == xs[i]: break', setup='xs, n = range(256), 0', repeat=8))
4.6937971115112305
>>> min(timeit.repeat('for i in reversed(xrange(0, len(xs))):\n    if 128 == xs[i]: break', setup='xs, n = range(256), 0', repeat=8))
4.809093952178955
>>> min(timeit.repeat('for i, x in enumerate(reversed(xs), 1):\n    if 128 == x: break', setup='xs, n = range(256), 0', repeat=8))
4.931743860244751
>>> min(timeit.repeat('for i, x in enumerate(xs[::-1]):\n    if 128 == x: break', setup='xs, n = range(256), 0', repeat=8))
5.548468112945557
>>> min(timeit.repeat('for i in xrange(len(xs), 0, -1):\n    if 128 == xs[i - 1]: break', setup='xs, n = range(256), 0', repeat=8))
6.286104917526245
>>> min(timeit.repeat('i = len(xs)\nwhile 0 < i:\n    i -= 1\n    if 128 == xs[i]: break', setup='xs, n = range(256), 0', repeat=8))
8.384078979492188

Итак, самый уродливый вариант xrange(len(xs)-1,-1,-1) - самый быстрый.

0 голосов
/ 26 декабря 2017

Простой способ:

n = int(input())
arr = list(map(int, input().split()))

for i in reversed(range(0, n)):
    print("%d %d" %(i, arr[i]))
0 голосов
/ 22 февраля 2019

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

>>> a = ["foo", "bar", "baz"]
>>> for i in range(len(a)):
...     print(~i, a[~i]))
-1 baz
-2 bar
-3 foo
0 голосов
/ 09 февраля 2009

здесь пригодится обратная функция:

myArray = [1,2,3,4]
myArray.reverse()
for x in myArray:
    print x
0 голосов
/ 03 июня 2019

Я думаю, что самый элегантный способ - преобразовать enumerate и reversed, используя следующий генератор

(-(ri+1), val) for ri, val in enumerate(reversed(foo))

, который генерирует обратную сторону enumerate итератора

Пример:

foo = [1,2,3]
bar = [3,6,9]
[
    bar[i] - val
    for i, val in ((-(ri+1), val) for ri, val in enumerate(reversed(foo)))
]

Результат:

[6, 4, 2]
0 голосов
/ 01 июня 2016

Чтобы использовать отрицательные индексы: начинайте с -1 и отступайте на -1 на каждой итерации.

>>> a = ["foo", "bar", "baz"]
>>> for i in range(-1, -1*(len(a)+1), -1):
...     print i, a[i]
... 
-1 baz
-2 bar
-3 foo
...