2009-06-13 90 views
6

是否有一種優雅的pythonic方法來捕獲for循環中的第一個和最後一個項目,該循環正在遍歷生成器?在Python 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 

此代碼嘗試獲取月結束的一週的第一天以及該月結束的一週的最後一天。例如:對於六月,月開始應評估爲5/31/09。儘管從技術上講這是5月份的一天,但這是6月份第一天的第一天。

月份日期是一個發電機,所以我不能做[:-1]的事情。有什麼更好的方式來處理這個問題?

回答

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比幻數好。

+0

+1,假設你改變MONTH_END到month_dates [-1](沒有冒號) – Triptych 2009-06-13 01:05:18

+0

謝謝,三聯。 – 2009-06-13 01:06:16

10

這個怎麼樣?

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

month_end = date 

enumerate()讓你找到的第一個和date變量落在圈外給你最後一個。

2

對於這個特定的問題,我想我會與馬修弗拉申的解決方案。這對我來說似乎是最直接的。

如果您的問題是爲了更普遍的採取,但是,對於任何生成器(具有未知和可能大量元素),那麼更像是RichieHindle的方法可能會更好。我對他的解決方案稍作修改是不一一列舉和測試元素0,而只是搶到第一要素明確:

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

Richie的得到了正確的想法。更簡單:

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