是否有优雅和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]的事情。有什么更好的办法来解决这个问题?
答案 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