如何使Python的enumerate函数从较大的数字枚举到较小的数字(降序,递减,倒计时)?或者一般来说,如何使用不同的步进增量/减量enumerate?
例如,应用于list的此函数['a', 'b', 'c']具有起始值10和步骤-2,将生成迭代器[(10, 'a'), (8, 'b'), (6, 'c')].
Mir*_*lov 19
我没有找到比写一个简单的生成器更优雅,惯用和简洁的方法:
def enumerate2(xs, start=0, step=1):
for x in xs:
yield (start, x)
start += step
Run Code Online (Sandbox Code Playgroud)
例子:
>>> list(enumerate2([1,2,3], 5, -1))
[(5, 1), (4, 2), (3, 3)]
>>> list(enumerate2([1,2,3], 5, -2))
[(5, 1), (3, 2), (1, 3)]
Run Code Online (Sandbox Code Playgroud)
如果你不理解上面的代码,请阅读Python中"yield"关键字的作用是什么?和Python的生成器和迭代器之间的区别.
一种选择是zip您可以迭代到range:
for index, item in zip(range(10, 0, -2), ['a', 'b', 'c']):
...
Run Code Online (Sandbox Code Playgroud)
这确实有一个局限性,您需要知道range应该走多远(应该覆盖的最小值-在我的示例中,多余的部分将被截断zip)。
如果您不知道,则可以滚动自己的“无限range”并使用:
>>> def inf_range(start, step):
"""Generator function to provide a never-ending range."""
while True:
yield start
start += step
>>> list(zip(inf_range(10, -2), ['a', 'b', 'c']))
[(10, 'a'), (8, 'b'), (6, 'c')]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5377 次 |
| 最近记录: |