Python只枚举反向索引

roz*_*zzy 18 python reverse enumerate python-3.x

我试图扭转所给出的索引,enumerate同时保留列举的列表的原始顺序.

假设我有以下内容:

>> range(5)
[0, 1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

如果我列举这个,我会得到以下内容:

>> list(enumerate(range(5)))
[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)]
Run Code Online (Sandbox Code Playgroud)

但是我想要反转枚举提供的索引,以便得到:

[(4, 0), (3, 1), (2, 2), (1, 3), (0, 4)]
Run Code Online (Sandbox Code Playgroud)

到目前为止,我有以下代码:

reversed(list(enumerate(reversed(range(5)))))
Run Code Online (Sandbox Code Playgroud)

我只是想知道是否有更简洁的方法来做到这一点?

Net*_*ave 19

如何使用拉链而不是反转范围?

>>> 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)]
Run Code Online (Sandbox Code Playgroud)

正如@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)
Run Code Online (Sandbox Code Playgroud)


man*_*ito 7

我不知道这种解决方案是否对您更好,但至少它更短:

>>> [(4 - x, x) for x in range(5)]
[(4, 0), (3, 1), (2, 2), (1, 3), (0, 4)]
Run Code Online (Sandbox Code Playgroud)


Rem*_*ich 6

只需取列表的长度,然后从中减去索引即可。

L = range(5)

for i, n in L:
    my_i = len(L) -1 - i
    ...
Run Code Online (Sandbox Code Playgroud)

或者,如果您确实需要发电机:

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
Run Code Online (Sandbox Code Playgroud)

enumerate()因为它与通用迭代器一起工作,所以不可能做到这一点。例如,您可以将其传递给甚至没有“反向索引”的无限迭代器。


Emi*_*mil 5

假设您的列表不长,并且不会遇到性能错误,则可以使用list(enumerate(range(5)[::-1]))[::-1]

测试:

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