【发布时间】:2012-12-27 02:35:33
【问题描述】:
[edit] 我不确定这是否对 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() 内部。
【问题讨论】:
-
去掉递归?我很确定函数调用比在 for 循环中运行额外的值更昂贵。
-
嗯?我可能很愚蠢,但我无法为此提出一个“for-loop”解决方案,请指出我忽略了什么?
-
伪代码:
for i = start, i < end, i += step do batch_list.append([i, i + step]) forend。看起来很简单,我错过了什么吗? -
会很酷,如果 python
for循环以这种方式工作;) -
你不能使用
for x in xrange(start,stop,step)构造得到那个结果吗?