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)))))

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

原文由 rozzy 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 624
2 个回答

如何使用 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)

原文由 Netwave 发布,翻译遵循 CC BY-SA 3.0 许可协议

我不知道这个解决方案是否更适合你,但至少它更短:

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

原文由 mandrewcito 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题