2009-06-13 14 views
6

के लिए एक पायथन में पहली और आखिरी वस्तु प्राप्त करना क्या एक जनरेटर पर फिर से चलने वाले लूप में पहली और आखिरी वस्तु को फंसाने का एक सुरुचिपूर्ण और पायथन तरीका है?लूप

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 को करना चाहिए। हालांकि यह तकनीकी रूप से मई में एक दिन है, यह जून के शुरू होने वाले सप्ताह का पहला दिन है।

महीनों की तारीख एक जनरेटर है इसलिए मैं [: -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, आप [-1] (कोई कोलन) month_dates को month_end – Triptych

+0

धन्यवाद, त्रिफलक बदलने संभालने। –

+0

नाइटपिकनेस का बहुत छोटा बिंदु: जैसा कि ओपी इंगित करता है, यह वास्तव में आपको मुद्रित कैलेंडर पर तिथियां देता है, शुरुआत में fillers के साथ पूरा होता है और 7-दिन के सप्ताह बनाने के लिए समाप्त होता है। इसलिए एक महीने के लिए सूची का अधिकतम आकार 42 है। (मुझे पता है, आधुनिक मशीनों की स्मृति क्षमता अतिरिक्त 11 तिथियों को संभालने के लिए उपभेद है।) –

10

इस बारे में कैसे?

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

month_end = date 

enumerate() आप पहली बार मिल date चर आपने पिछले एक देने के लिए लूप से बाहर गिर जाता है की सुविधा देता है, और।

2

इस विशिष्ट समस्या के लिए, मुझे लगता है कि मैं मैथ्यू फ्लैंचन के समाधान के साथ जाऊंगा। यह मेरे लिए सबसे सरल लगता है।

यदि आपका प्रश्न किसी भी जनरेटर (अज्ञात और संभवतः बड़ी संख्या में तत्वों के साथ) के लिए अधिक आम तौर पर लिया जाना है, तो रिचीइंडल के दृष्टिकोण की तरह कुछ और बेहतर हो सकता है।

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

रिची का सही विचार आया: उनके समाधान पर मेरे मामूली संशोधन की गणना नहीं करने के लिए और तत्व 0 के लिए परीक्षण, बल्कि सिर्फ पहला तत्व स्पष्ट रूप से हड़पने है। सरल:

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

+1 मुझे यह पसंद है। "पायथनिक" (जो शायद "पायथनिक" में परिवर्तित हो जाता है) –

+0

पहले तत्व के लिए परिवर्तनीय –

+0

+1 के लिए चालाक उपयोग() T.Stone के साथ पहला तत्व और अनुबंध प्राप्त करने के लिए – JCotton