2024-06-17 16:24:08 发布
网友
如何使Python的^{}函数从大到小(降序、递减、倒计时)枚举?或者一般来说,如何在enumerate中使用不同的步长增量/减量?
enumerate
例如,应用于列表['a', 'b', 'c']、起始值为10、步骤为-2的此类函数将生成迭代器[(10, 'a'), (8, 'b'), (6, 'c')]。
['a', 'b', 'c']
10
-2
[(10, 'a'), (8, 'b'), (6, 'c')]
我没有找到比编写一个简单的生成器更优雅、更习惯、更简洁的方法了:
def enumerate2(xs, start=0, step=1): for x in xs: yield (start, x) start += step
示例:
>>> 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)]
如果您不理解上述代码,请阅读What does the "yield" keyword do in Python?和Difference between Python's Generators and Iterators。
另一种选择是使用itertools.count,这有助于通过步骤在反向中“枚举”。
itertools.count
import itertools counter = itertools.count(10, -2) [(next(counter), letter) for letter in ["a", "b", "c"]] # [(10, 'a'), (8, 'b'), (6, 'c')]
特征
count()
next()
一个选项是zip您的iterable到range:
zip
range
for index, item in zip(range(10, 0, -2), ['a', 'b', 'c']): ...
这确实有一个限制,您需要知道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')]
我没有找到比编写一个简单的生成器更优雅、更习惯、更简洁的方法了:
示例:
如果您不理解上述代码,请阅读What does the "yield" keyword do in Python?和Difference between Python's Generators and Iterators。
另一种选择是使用
itertools.count
,这有助于通过步骤在反向中“枚举”。特征
count()
next()
迭代count()
本质上是无限的;如果终端边界未知,则有用 (见@jornsharpe)一个选项是
zip
您的iterable到range
:这确实有一个限制,您需要知道
range
应该走多远(它应该覆盖的最小值-在我的示例中,多余部分将被zip
截断)。如果你不知道,你可以滚动你自己的“无限
range
”并使用它:相关问题 更多 >
编程相关推荐