2010-01-13 12 views

उत्तर

9

जब लूप समाप्त होता है, तो elt वैरिएबल गुंजाइश से बाहर नहीं जाता है, और अभी भी लूप द्वारा दिया गया अंतिम मान रखता है। तो आप लूप के अंत में कोड डाल सकते हैं और elt चर पर काम कर सकते हैं। यह बहुत सुंदर नहीं है, लेकिन पाइथन के स्कोपिंग नियम भी सुंदर नहीं हैं।

इस के साथ एकमात्र समस्या (धन्यवाद, cvondrick) यह है कि लूप कभी निष्पादित नहीं हो सकता है, जिसका अर्थ यह होगा कि elt मौजूद नहीं है - हमें NameError मिल जाएगा। ऐसा करने के लिए पूर्ण तरीका तो यह मोटे तौर पर होगा:

del elt # not necessary if we haven't use elt before, but just in case 
for elt in itertools.chain.from_iterable(node): 
    do_stuff_to_each(elt) 
try: 
    do_stuff_to_last(elt) 
except NameError: # no last elt to do stuff to 
    pass 
+4

बस उस मामले में सावधान रहें जब लूप कभी निष्पादित नहीं होता क्योंकि इससे कुछ जंगली निष्पादन पथ हो सकता है। – carl

+0

यह एक अच्छा मुद्दा है। इसे मेरे उत्तर में जोड़ना। –

+1

बस 'अन्य' खंड में अंतिम तत्व पर लागू करने के लिए कोड ड्रॉप करें। –

2

आप कर सकते हैं नहीं से प्रति। आपको वर्तमान आइटम को स्टोर करने, इटरेटर को अग्रिम करने और StopIteration अपवाद को पकड़ने की आवश्यकता होगी। और फिर आपको किसी भी तरह संकेत करना होगा कि आपके पास अंतिम वस्तु है।

+0

यह करना मुश्किल नहीं होगा, और यह एक सामान्य समाधान है, लेकिन वर्तमान कार्य के लिए पूरी तरह से आवश्यक नहीं है। –

18

आप मैन्युअल रूप से थोड़ी देर के पाश में इटरेटर को आगे बढ़ाने iter.next() का उपयोग कर, तो StopIteration अपवाद को पकड़ने करके ऐसा कर सकते:

>>> from itertools import chain 
>>> it = chain([1,2,3],[4,5,6],[7,8,9]) 
>>> while True: 
...  try: 
...   elem = it.next() 
...  except StopIteration: 
...   print "Last element was:", elem, "... do something special now" 
...   break 
...  print "Got element:", elem 
...  
... 
Got element: 1 
Got element: 2 
Got element: 3 
Got element: 4 
Got element: 5 
Got element: 6 
Got element: 7 
Got element: 8 
Got element: 9 
Last element was: 9 ... do something special now 
>>> 
+0

यह एक सामान्य समाधान (यानी पिछले दो, पिछले तीन, आदि) लेकिन अंतिम तत्व के लिए, मेरा समाधान (आईएमएचओ) क्लीनर है। –

+6

आपके समाधान में कम कोड है, लेकिन आईएमओ यह कम स्पष्ट है क्योंकि यह एक गैर-स्पष्ट स्कॉइंग नियम पर निर्भर करता है। मैं अधिक स्पष्ट दृष्टिकोण पसंद करता हूं। –

1

मैं कुछ करना इस तरह:

rng = len(mlist) 
for i in range(rng): 
    foo = mlist[i] 
    foo.do_something_for_every_item_regardless() 
    if i == rng - 1: #since we go from 0 to rng-1 
     foo.last_item_only_operation() 
संबंधित मुद्दे