具有反向枚举列表的最pythonic方法是什么?

时间:2018-02-15 12:54:15

标签: python

首先想到的是:

>>> l = list('abcdef')
>>> for i in range(len(l)-1, -1, -1):
...   item = l[i]
...   print(i, item)
...
5 f
4 e
3 d
2 c
1 b
0 a

我尝试使用以下内容:

>>> l
['a', 'b', 'c', 'd', 'e', 'f']
>>> for i,ch in reversed(enumerate(l)):
...   print(i,ch)
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'enumerate' object is not reversible

但显然列举了&#39;对象不可逆。我可以用它来欺骗它:

>>> for i,ch in reversed(list(enumerate(l))):
...   print(i,ch)
...
5 f
4 e
3 d
2 c
1 b
0 a

但这感觉不对 - 这有点麻烦。有一个更好的方法吗?也许一些&#34; inverse_enumerate&#34; hidden是一个类似于集合或者itertools的库吗?

感谢。

1 个答案:

答案 0 :(得分:1)

这可能不是最pythonic方法,但您可以重复使用documentation on enumerate提供的代码来重新实现您自己的反向enumerate

该doc提供以下代码:

def enumerate(sequence, start=0):
    n = start
    for elem in sequence:
        yield n, elem
        n += 1

以下是renumerate函数的提议,它以相反的顺序生成序列的元素:

def renumerate(sequence, start=None):
    n = start
    if start is None:
        start = len(sequence) - 1
    for elem in sequence[::-1]:
        yield n, elem
        n -= 1

不幸的是,这不适用于生成器,因为它需要知道序列的长度。