Python向下枚举或使用自定义步骤进行枚举

Mir*_*lov 12 python enumerate

如何使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的生成器和迭代器之间的区别.


jon*_*rpe 7

一种选择是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)