获取python循环中的第一个和最后一个项目

时间:2009-06-13 00:57:37

标签: python for-loop

是否有优雅和pythonic的方法来捕获for循环中的第一个和最后一个项目,该循环遍历生成器?

from calendar import Calendar

cal = Calendar(6)
month_dates = cal.itermonthdates(year, month)
for date in month_dates:
    if (is first item):     # this is fake
        month_start = date
    if (is last item):      # so is this
        month_end = date

此代码尝试获取该月结束的一周的第一天,以及该月结束的一周中的最后一天。示例:对于6月,月开始应评估为5/31/09。虽然技术上是五月份的一天,但这是六月开始的一周的第一天。

月份日期是一个生成器,所以我不能做[:-1]的事情。有什么更好的办法来解决这个问题?

4 个答案:

答案 0 :(得分:11)

里奇有正确的想法。更简单的:

month_dates = cal.itermonthdates(year, month)
month_start = month_dates.next()
for month_end in month_dates: pass # bletcherous

答案 1 :(得分:10)

这个怎么样?

for i, date in enumerate(month_dates):
    if i == 0:
        month_start = date

month_end = date

enumerate()可让您找到第一个变量,date变量不在循环中,可以为您提供最后一个变量。

答案 2 :(得分:10)

我会在开头强制它进入一个列表:

from calendar import Calendar, SUNDAY

cal = Calendar(SUNDAY)
month_dates = list(cal.itermonthdates(year, month))

month_start = month_dates[0]
month_end = month_dates[-1]

由于只有42天(计算领先和拖尾背景),这对性能影响可以忽略不计。

另外,使用SUNDAY比魔术数字要好。

答案 3 :(得分:2)

对于这个具体问题,我想我会选择Matthew Flaschen的解决方案。这对我来说似乎最直接。

如果你的问题要更普遍地用于任何发电机(具有未知且可能大量的元件),那么更像RichieHindle的方法可能会更好。我对他的解决方案的轻微修改不是枚举和测试元素0,而是明确地抓住第一个元素:

month_dates = cal.itermonthdates(year, month)
month_start = month_dates.next()
for date in month_dates:
    pass
month_end = date