[编辑]我不确定这是否更适合codereview,如果是,请迁移:)谢谢!
所以我们坐在这里,研究一个半学术性的问题。
给定一个start
、stop
和step
,生成一个范围元组列表,以便
gen_range(100, 140, 10)
会产生
[(100, 110), (110, 120), (120, 130), (130, 140)]
另外,考虑到这个事实,比如说,它应该以100的步长迭代500M整数,而不是永远迭代。
我提出的实现如下:
def gen_range(start, stop, step):
llist = range(start, stop+step, step)
batch_list = []
if llist[-1] > stop:
llist[-1] = stop
for a, b in enumerate(llist[:-1]):
batch_list.append((llist[a], llist[a+1]))
print batch_list
gen_range(100000000,600000000,100)
但我不能停止思考,它可以以一种更有效的(也包括代码长度方面的)方式来完成。有什么建议吗?
[编辑]
有件事我忘了指出。如果范围边界不等于步骤,即您有以下情况:
gen_range(100, 143, 10)
上边界应该是143,而不是150,因为这里的一些答案会产生,因为range()
内部。
像这样的:
或者使用
zip()
:很短的路:
更详细的方式:
也许是通过发电机?
调用此函数将提供一个生成器对象,该对象将按顺序生成每个元组。您可以这样使用它:
它将输出。。。
如果您始终确定
stop-start
是step
的偶数倍,则可以更简单地使用生成器表达式:还要注意,如果要将生成器转换为一个列表,并将所有结果保存在内存中,只需将其传递给
list()
:我不确定我是否正确理解了这个问题,但这可以通过简单的列表理解来完成:
如果一次只需要遍历一个列表元素,我强烈建议您使用生成器理解:
您可以在一个循环中对其进行迭代:
相关问题 更多 >
编程相关推荐