2009-06-13 11 views
6

Gibt es eine elegante und pythische Methode, um das erste und letzte Element in einer for-Schleife einzufangen, die über einen Generator iteriert?Das erste und letzte Element in einem Python für die Schleife abrufen

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 

Dieser Code versucht, den ersten Tag der Woche der Monat endet am bekommen, und der letzte Tag der Woche der Monat endet am. Beispiel: Für den Monat Juni sollte der Monatsbeginn bis zum 31.05.09 ausgewertet werden. Obwohl es sich eigentlich um einen Tag im Mai handelt, ist es der erste Tag der Woche, an dem der Juni beginnt.

Monat-Daten ist ein Generator, so dass ich das [: -1] Ding nicht tun kann. Was ist ein besserer Weg, damit umzugehen?

Antwort

10

würde ich es in eine Liste zwingen, nur am Anfang:

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] 

Da es nur 42 Tage sein kann (Zählen führender und Tailing-Kontext), diese vernachlässigbare Auswirkungen auf die Leistung hat.

Auch mit SUNDAY ist besser als eine magische Zahl.

+0

+1, vorausgesetzt, Sie month_end zu month_dates [-1] (kein Doppelpunkt) – Triptych

+0

Danke, Triptychon ändern. –

+0

Sehr kleiner Punkt der Nitpickiness: Wie das OP anspielt, gibt itermonthdates Ihnen tatsächlich die Daten auf einem gedruckten Kalender, komplett mit Füllstoffen am Anfang und am Ende, um 7-Tage-Wochen zu machen. Daher ist die maximale Größe der Liste für einen Monat 42. (Ich weiß, die Speicherkapazität moderner Maschinen Stämme die zusätzlichen 11 Daten zu behandeln.;) –

10

Wie wäre es damit?

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

month_end = date 

enumerate() können Sie die ersten zu finden, und die date Variablen fallen aus der Schleife Ihnen die letzten zu geben.

2

Für dieses spezielle Problem, ich denke, ich würde mit Matthew Flaschen Lösung gehen. Es scheint mir am einfachsten zu sein.

Wenn Ihre Frage allgemein für einen Generator (mit einer unbekannten und möglicherweise großen Anzahl von Elementen) gedacht ist, dann könnte etwas mehr wie RichieHindle Ansatz besser sein. Meine leichte Modifikation auf seiner Lösung nicht aufzuzählen und Test für das Element 0, sondern nur das erste Element greifen explizit:

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

Richies die richtige Idee. Einfachere:

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

+1 Ich mag es. Scheint "Pythonish" (was wahrscheinlich zu "Pythonic" konvergiert) –

+0

clevere Verwendung der Variablen –

+0

+1 für next(), um das erste Element und die Übereinstimmung mit T.Stone zu greifen – JCotton

Verwandte Themen