Python перечисляет только обратный индекс

Я пытаюсь изменить индекс, указанныйenumerate при сохранении первоначального порядка перечисления списка.

Предположим, у меня есть следующее:

>> range(5)
[0, 1, 2, 3, 4]

Если я перечислю это, я получу следующее:

>> list(enumerate(range(5)))
[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)]

Однако я хочу изменить индекс, предоставленный перечислением, чтобы я получил:

[(4, 0), (3, 1), (2, 2), (1, 3), (0, 4)]

Пока у меня есть следующий код:

reversed(list(enumerate(reversed(range(5)))))

Мне просто интересно, есть ли более аккуратный способ сделать это?

Ответы на вопрос(8)

Просто возьмите длину вашего списка и вычтите индекс из этого ...

L = range(5)

for i, n in L:
    my_i = len(L) -1 - i
    ...

Или если вам действительно нужен генератор:

def reverse_enumerate(L):
   # Only works on things that have a len()
   l = len(L)
   for i, n in enumerate(L):
       yield l-i-1, n

enumerate() не может сделать это, так как он работает с общими итераторами. Например, вы можете передать его бесконечным итераторам, которые даже не имеют «обратного индекса».

Просто использоватьlen(lst)-i везде я использую. или же:

[(len(range(5)) - x, x) for x in range(5)]
 tzot12 авг. 2019 г., 00:51
-(i+1) или же-1-i.
Решение Вопроса

Как насчет использования zip вместо обратного диапазона?

>>> zip(range(9, -1, -1), range(10))
[(9, 0), (8, 1), (7, 2), (6, 3), (5, 4), (4, 5), (3, 6), (2, 7), (1, 8), (0, 9)]


>>> def reversedEnumerate(l):
        return zip(range(len(l)-1, -1, -1), l)
>>> reversedEnumerate(range(10))
[(9, 0), (8, 1), (7, 2), (6, 3), (5, 4), (4, 5), (3, 6), (2, 7), (1, 8), (0, 9)]

Как подсказывает @julienSpronk, используйтеizip чтобы получить генератор, а такжеxrange:

import itertools
>>> import itertools
>>> def reversedEnumerate(l):
...     return itertools.izip(xrange(len(l)-1, -1, -1), l)
...     
>>> reversedEnumerate(range(10))
<itertools.izip object at 0x03749760>
>>> for i in reversedEnumerate(range(10)):
...     print i
...     
(9, 0)
(8, 1)
(7, 2)
(6, 3)
(5, 4)
(4, 5)
(3, 6)
(2, 7)
(1, 8)
(0, 9)
 RemcoGerlich03 авг. 2016 г., 10:44
Также хорошая идея.
 rozzy03 авг. 2016 г., 15:20
Спасибо! Я всегда забываю про зип!
 Julien Spronck03 авг. 2016 г., 10:47
или жеitertools.izip получить генератор

что и @RemcoGerlich, но я используюlist comprehension непосредственно, что делает код теперь 1-лайн:

def generatelist(x):
    return [(x-1-i,n) for i,n in enumerate(range(x))]

Относительно дилеммы выбораgenerator или жеlist comprehension, Вот это предложенный способ:

В основном, используйте выражение генератора, если все, что вы делаете, это итерация один раз. Если вы хотите сохранить и использовать сгенерированные результаты, то вам, вероятно, лучше понять список.

Python 2
import itertools

def reversed_enumerate(seq):
    return itertools.izip(reversed(range(len(seq))), reversed(seq))
Python 3

zip заitertools.izip :)

подходит ли вам это решение, но, по крайней мере, оно короче:

>>> [(4 - x, x) for x in range(5)]
[(4, 0), (3, 1), (2, 2), (1, 3), (0, 4)]

вы можете создать свой собственный генератор:

def reverse_enum(lst):
    for j, item in enumerate(lst):
        yield len(lst)-1-j, item

print list(reverse_enum(range(5)))
# [(4, 0), (3, 1), (2, 2), (1, 3), (0, 4)]

или же

def reverse_enum(lst):
    return ((len(lst)-1-j, item) for j, item in enumerate(lst))

Если ваш список не длинный и вы не столкнетесь с ошибками производительности, вы можете использоватьlist(enumerate(range(5)[::-1]))[::-1].

Тестовое задание:

>>> list(enumerate(range(5)[::-1]))[::-1] [(0, 4), (1, 3), (2, 2), (3, 1), (4, 0)]

 Netwave03 авг. 2016 г., 10:51
пожалуйста, прочитайте внимательно, что он спрашивает
 Emil03 авг. 2016 г., 11:06
К сожалению! Правильно. фиксированный.
 Netwave03 авг. 2016 г., 11:04
он хочет, чтобы индексы были изменены, а не список
 Emil03 авг. 2016 г., 10:54
Я предоставил самый аккуратный способ сделать это, как я понял. Однако этот вопрос является своего рода вкусом.
 zwep21 июн. 2018 г., 12:26
Это то, что я бы тоже сделал. Мне бы лично даже наплевать на последний реверс ...

Ваш ответ на вопрос