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 生成的最后一个项

12 回复

在 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

关键点:

  1. xrange 对象支持 len() 和索引,所以我们可以用 len(xr) 获取长度。
  2. 最后一个值的计算公式是:start + (length - 1) * step。这个公式对正负步长都有效。
  3. 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]>

但怎么判断是不是最后个呢?

for i, stmp in enumerate(xrange(…))

if stmp + 60 >= end_time_st:

这还不如直接用 range。。。

用 unix 时间,再转回去。

把是不是最后一个的判断挪到循环外面去?
因为 for 循环结束后,stmp 就停在最后一个值上了,循环外做一次 do 操作

回到顶部