Так что я могу начать с len(collection)
и закончить collection[0]
.
Я также хочу иметь доступ к индексу цикла.
Так что я могу начать с 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]
.
- person jfs; 09.02.2009
reversed([a,b,c])
не создает копию [a, b, c]
.
- person jfs; 09.02.2009
reversed(list(enumerate(a)))
работает, но не оптимизирован. Здесь предлагается альтернатива с использованием лямбда-функции: christophe-simonis-at-tiny.blogspot.ca/2008/08/
- person Bill; 25.01.2016
enumerate(reversed(a))
тоже могло бы стать решением. Однако индексы будут в обратном порядке, т.е. последний элемент имеет индекс 0
.
- person Snow bunting; 06.07.2017
len(a)-i-1
, а при доступе к списку b
такой же длины b[-i-1]
эквивалентно b[len(a)-i-1]
- person CervEd; 03.06.2019
(-(ri+1), val) for ri, val in enumerate(reversed(foo))
, см. Мой ответ например
- person CervEd; 03.06.2019
for i in range(len(a)-1, -1, -1)
), поскольку это одна строка и действительно позволяет избежать копирования или создания списка.
- person Markus; 04.06.2019
Ты можешь сделать:
for item in my_list[::-1]:
print item
(Или все, что вы хотите сделать в цикле for.)
Срез [::-1]
переворачивает список в цикле for (но фактически не изменяет ваш список «навсегда»).
[::-1]
создает неглубокую копию, поэтому он не меняет массив ни навсегда, ни временно.
- person jfs; 09.02.2009
0
, возможно -1
, поэтому заканчивается в начале) и step: -1
(выполняет итерацию назад по списку, 1
элемента за раз).
- person Edward; 16.05.2016
reversed()
- person RustyShackleford; 26.07.2017
Сделать это можно так:
for i in range(len(collection)-1, -1, -1):
print collection[i]
# print(collection[i]) for python 3. +
Итак, ваша догадка была довольно близкой :) Немного неудобно, но в основном она гласит: начните с 1 меньше, чем len(collection)
, продолжайте, пока не дойдете до значения непосредственно перед -1, с шагом -1.
К вашему сведению, функция help
очень полезна, поскольку позволяет просматривать документы для чего-либо из консоли Python, например:
help(range)
-1
. Я бы просто сказал reversed(xrange(len(collection)))
- person musiphil; 07.09.2013
Если вам нужен индекс цикла и вы не хотите дважды проходить весь список или использовать дополнительную память, я бы написал генератор.
def reverse_enum(L):
for index in reversed(xrange(len(L))):
yield index, L[index]
L = ['foo', 'bar', 'bas']
for index, item in reverse_enum(L):
print index, item
reversed(xrange(len(L)))
производит те же индексы, что и xrange(len(L)-1, -1, -1)
.
- person jfs; 10.02.2009
for index, item in enumerate(reversed(L)): print len(L)-1-index, item
- person Don Kirkby; 06.11.2014
xrange(len(L)-1, -1, -1)
должен выполнить свою работу. Кстати, почему reversed(xrange())
работает, а reversed(enumerate())
нет?
- person Antoine Pinsard; 26.08.2015
enumerate
- это чистый объект-итератор, в то время как xrange технически является последовательностью. iter(xrange(..))
однако имеет те же ограничения, что и enumerate
и любой другой итератор.
- person Tadhg McDonald-Jensen; 14.05.2016
Встроенная функция reversed
удобна:
for item in reversed(sequence):
В документации для reverse объясняются его ограничения.
Для случаев, когда мне нужно пройти последовательность в обратном порядке вместе с индексом (например, для модификаций на месте, изменяющих длину последовательности), у меня есть эта функция, определяющая мой модуль codeutil:
from six.moves import zip as izip, range as xrange
def reversed_enumerate(sequence):
return izip(
reversed(xrange(len(sequence))),
reversed(sequence),
)
Это позволяет избежать создания копии последовательности. Очевидно, что reversed
ограничения все еще применяются.
Подход без импорта:
for i in range(1,len(arr)+1):
print(arr[-i])
or
for i in arr[::-1]:
print(i)
Кроме того, вы можете использовать функции «диапазона» или «подсчета». Следующее:
a = ["foo", "bar", "baz"]
for i in range(len(a)-1, -1, -1):
print(i, a[i])
3 baz
2 bar
1 foo
Вы также можете использовать "count" из itertools следующим образом:
a = ["foo", "bar", "baz"]
from itertools import count, takewhile
def larger_than_0(x):
return x > 0
for x in takewhile(larger_than_0, count(3, -1)):
print(x, a[x-1])
3 baz
2 bar
1 foo
3 foo\n2 bar\n1 baz
- person amiller27; 22.06.2018
Как насчет того, чтобы не создавать новый список, вы можете обойтись путем индексации:
>>> foo = ['1a','2b','3c','4d']
>>> for i in range(len(foo)):
... print foo[-(i+1)]
...
4d
3c
2b
1a
>>>
OR
>>> length = len(foo)
>>> for i in range(length):
... print foo[length-i-1]
...
4d
3c
2b
1a
>>>
Мне нравится однострочный генератор:
((i, sequence[i]) for i in reversed(xrange(len(sequence))))
В python 3 список создает копию, поэтому reversed(list(enumerate(collection))
может быть неэффективным, поскольку создание другого списка не оптимизируется.
Если коллекция точно является списком, то лучше всего скрыть сложность за итератором.
def reversed_enumerate(collection: list):
for i in range(len(collection)-1, -1, -1):
yield i, collection[i]
Итак, самый чистый:
for i, elem in reversed_enumerate(['foo', 'bar', 'baz']):
print(i, elem)
Используйте list.reverse()
, а затем повторите, как обычно.
http://docs.python.org/tutorial/datastructures.html
reversed
.
- person Nelo Mitranim; 08.11.2020
во что бы то ни стало, вы тоже можете это сделать. очень простой.
a = [1, 2, 3, 4, 5, 6, 7]
for x in xrange(len(a)):
x += 1
print a[-x]
print a[-(x+1)]
и избежать переназначения индекса в теле цикла.
- person Malcolm; 26.11.2017
здесь пригодится обратная функция:
myArray = [1,2,3,4]
myArray.reverse()
for x in myArray:
print x
Если вам нужен индекс, а ваш список невелик, наиболее читаемый способ - сделать 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)
Я думаю, что самый элегантный способ - преобразовать 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]
Чтобы использовать отрицательные индексы: начните с -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
Вы также можете использовать цикл while
:
i = len(collection)-1
while i>=0:
value = collection[i]
index = i
i-=1
Вы можете использовать отрицательный индекс в обычном цикле 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
Предполагая, что задача состоит в том, чтобы найти последний элемент, который удовлетворяет некоторому условию в списке (т.е. первый при взгляде назад), я получаю следующие числа:
>>> 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)
- самый быстрый.
Если вы не возражаете против отрицательного значения индекса, вы можете:
>>> a = ["foo", "bar", "baz"]
>>> for i in range(len(a)):
... print(~i, a[~i]))
-1 baz
-2 bar
-3 foo
Другие ответы хороши, но если вы хотите использовать стиль понимания списка
collection = ['a','b','c']
[item for item in reversed( collection ) ]
Простой способ:
n = int(input())
arr = list(map(int, input().split()))
for i in reversed(range(0, n)):
print("%d %d" %(i, arr[i]))
input_list = ['foo','bar','baz']
for i in range(-1,-len(input_list)-1,-1)
print(input_list[i])
Я думаю, что это также простой способ сделать это ... читать с конца и продолжать уменьшать до длины списка, так как мы никогда не выполняем "конечный" индекс, поэтому добавляем -1 также
вы можете использовать генератор:
li = [1,2,3,4,5,6]
len_li = len(li)
gen = (len_li-1-i for i in range(len_li))
наконец:
for i in gen:
print(li[i])
надеюсь, это поможет вам.