如何在python2中获取反向枚举?

6 投票
6 回答
4284 浏览
提问于 2025-04-18 13:41

我有一个这样的列表:

[(key1, val1), (key2, val2), ...]

我想要遍历这个列表,每次都获取到键和项目的索引,而且是反向遍历。

现在我这样做:

for index, key in reversed(list(enumerate(map(lambda x: x[0], data)))):
    print index, key

这样做是没问题的,但我在担心这样做是否合适。有没有更好的方法呢?

6 个回答

0

在反向切片上使用enumerate()是可以的:

for i, x in enumerate(data[::-1]):
    print(len(data)-1-i, x[0])

这样做会创建最少的临时对象:只会有一个enumerate()对象和一个slice()对象。

0

如果性能不是特别重要,这两种方法都可以用。

sorted(enumerate(data), reverse=True)

reversed(list(enumerate(data)))
0
list = [('a', 1), ('b', 2)]

for n,k in reversed([(i,k[0]) for i, k in enumerate(list)]):
    print n,k

你应该用字典(dict)来代替列表(list),因为字典就是用来存储键值对的。

补充:这样做应该是有效的。

3

这里有一篇有趣的文章,讨论了这个问题。文中提出了以下解决方案:

from itertools import izip
reverse_enumerate = lambda l: izip(xrange(len(l)-1, -1, -1), reversed(l))
>>> a = ['a', 'b', 'c']
>>> it = reverse_enumerate(a)
>>> it.next()
(2, c)
7

enumerate() 这个函数只能往上计数,不能往下计数。如果你想要倒计时,可以使用 itertools.count() 这个对象

from itertools import izip, count

for index, item in izip(count(len(data) - 1, -1), reversed(data)):

这样做会从序列的长度开始(减去1),然后在反向序列中逐步往下计数。

演示:

>>> from itertools import izip, count
>>> data = ('spam', 'ham', 'eggs', 'monty')
>>> for index, item in izip(count(len(data) - 1, -1), reversed(data)):
...     print index, item
... 
3 monty
2 eggs
1 ham
0 spam

撰写回答