如何在python中获得反向枚举?

时间:2014-07-17 12:09:40

标签: python python-2.7

我有一个包含这种结构的列表:

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

我想迭代它获取关键和每一步的项目索引。以相反的顺序。

现在我这样做:

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

它完美无缺,但我只是担心这是否是一种正确的方法。可以有更好的解决方案吗?

5 个答案:

答案 0 :(得分:5)

enumerate()无法倒计时,只能倒数。改为使用itertools.count() object

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

答案 1 :(得分:1)

Here是关于这个问题的有趣文章。提出以下解决方案:

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)

答案 2 :(得分: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 with key / values,它们的用途是什么。

编辑:这应该有用。

答案 3 :(得分:0)

如果性能不是绝对关键的话,这两个条件就足够了。

sorted(enumerate(data), reverse=True)

reversed(list(enumerate(data)))

答案 4 :(得分:0)

反向切片上的 enumerate() 将起作用:

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

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