Python 中如何判断 xrange 生成的最后一个项
start_time = '2017-01-01 00:00:00'
end_time = '2017-07-01 00:00:00'
start_time_st = int(time.mktime(time.strptime(start_time, '%Y-%m-%d %H:%M:%S')))
end_time_st = int(time.mktime(time.strptime(end_time, '%Y-%m-%d %H:%M:%S')))
for stmp in xrange(start_time_st, end_time_st, 60):
…
需要生成一个 list,
if len(list)>=100 or stmp 是最后一个时:
do…
这个场景下,怎么判断 stmp 已经是最后一个了。求助大神们。
Python 中如何判断 xrange 生成的最后一个项
python2.7
在 Python 2 里,xrange 对象没有直接的方法来获取最后一个项,因为它是一个惰性生成器。不过,你可以通过计算来得到它。xrange(start, stop, step) 生成的最后一个值通常是 stop - 1(如果步长为正且 start < stop),但需要考虑步长和方向。
这里有个函数可以安全地计算 xrange 的最后一个项:
def last_of_xrange(xr):
"""
计算 xrange 对象的最后一个值。
参数:
xr: 一个 xrange 对象
返回:
该 xrange 生成的最后一个数值
"""
# 获取参数
start = xr[0]
stop = xr[-1] if xr else 0 # xr[-1] 会触发生成,但这里我们不用它直接计算
step = xr.step if len(xr) > 1 else 1
# 计算序列长度
length = len(xr)
if length == 0:
raise ValueError("xrange is empty")
# 根据公式计算最后一个值: start + (length - 1) * step
last_value = start + (length - 1) * step
return last_value
# 示例用法
xr = xrange(1, 10, 2)
print(last_of_xrange(xr)) # 输出: 9
xr2 = xrange(5, 0, -1)
print(last_of_xrange(xr2)) # 输出: 1
xr3 = xrange(3)
print(last_of_xrange(xr3)) # 输出: 2
关键点:
xrange对象支持len()和索引,所以我们可以用len(xr)获取长度。- 最后一个值的计算公式是:
start + (length - 1) * step。这个公式对正负步长都有效。 - 空
xrange(如xrange(0))需要单独处理。
注意: 在 Python 3 中,xrange 已被 range 取代,而 range 对象可以直接通过 r[-1] 获取最后一个元素(如果非空)。如果你在 Python 3 中工作,直接使用 range 会更简单。
一句话建议:用 start + (len(xr) - 1) * step 公式计算最稳妥。
用 arrow 库啊,你这么折腾时间不难受啊
import arrow
arrow.get(2017).span(‘month’)[:7]
2 行搞定的事情
我想指定一段时间,每隔 60 秒一个时间戳。要这段时间内的所有时间戳。
>>> from datetime import datetime
>>> import arrow
>>> start = datetime(2013, 5, 5, 12, 30)
>>> end = datetime(2013, 5, 5, 17, 15)
>>> for r in arrow.Arrow.range(‘hour’, start, end):
… print repr®
…
<Arrow [2013-05-05T12:30:00+00:00]>
<Arrow [2013-05-05T13:30:00+00:00]>
<Arrow [2013-05-05T14:30:00+00:00]>
<Arrow [2013-05-05T15:30:00+00:00]>
<Arrow [2013-05-05T16:30:00+00:00]>
但怎么判断是不是最后个呢?
if stmp + 60 >= end_time_st:
…
这还不如直接用 range。。。
把是不是最后一个的判断挪到循环外面去?
因为 for 循环结束后,stmp 就停在最后一个值上了,循环外做一次 do 操作


