Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Getting the first and last item in a python for loop

Is there an elegant and pythonic way to trap the first and last item in a for loop which is iterating over a generator?

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

This code is attempting to get the first day of the week the month ends on, and the last day of the week the month ends on. Example: for June, month-start should evaluate to 5/31/09. Even though it's technically a day in May, it's the first day of the week that June begins on.

Month-dates is a generator so i can't do the [:-1] thing. What's a better way to handle this?

like image 310
T. Stone Avatar asked Jun 13 '09 00:06

T. Stone


3 Answers

I would just force it into a list at the beginning:

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]

Since there can only be 42 days (counting leading and tailing context), this has negligible performance impact.

Also, using SUNDAY is better than a magic number.

like image 177
Matthew Flaschen Avatar answered Sep 18 '22 02:09

Matthew Flaschen


Richie's got the right idea. Simpler:

month_dates = cal.itermonthdates(year, month)
month_start = month_dates.next()
for month_end in month_dates: pass # bletcherous
like image 31
Tom Anderson Avatar answered Sep 19 '22 02:09

Tom Anderson


How about this?

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

month_end = date

enumerate() lets you find the first one, and the date variable falls out of the loop to give you the last one.

like image 22
RichieHindle Avatar answered Sep 19 '22 02:09

RichieHindle