2010-03-11 9 views
36

मुझे सूची में अंतिम तत्व के लिए कुछ विशेष ऑपरेशन करने की आवश्यकता है। क्या इससे कोई बेहतर तरीका है?पाइथन में अलग-अलग सूची में अंतिम तत्व का इलाज कैसे करें?

# itr is short for "iterable" and can be any sequence, iterator, or generator 

def notlast(itr): 
    itr = iter(itr) # ensure we have an iterator 
    prev = itr.next() 
    for item in itr: 
     yield prev 
     prev = item 

# lst is short for "list" and does not shadow the built-in list() 
# 'L' is also commonly used for a random list name 
lst = range(4) 
for x in notlast(lst): 
    print "Not last: ", x 
print "Last: ", lst[-1] 

notlast के लिए एक अन्य परिभाषा:

import itertools 
notlast = lambda lst:itertools.islice(lst, 0, len(lst)-1) 
+1

संभावित डु की विशेषता [पहचान करें कि आप पाइथन में एक लूप में किस पुनरावृत्ति पर हैं] (http://stackoverflow.com/questions/4751092/identify-wich-iteration-you-are-on-in-a-loop-in-python) –

उत्तर

48
for item in list[:-1]: 
    print "Not last: ", item 
print "Last: ", list[-1] 

आप सूची की एक प्रति बनाने के लिए नहीं करना चाहते हैं, तो आप एक साधारण जनरेटर बना सकते हैं आपका अनुक्रम बहुत लंबा नहीं है तो आप इसे केवल टुकड़ा कर सकते हैं:

for val in array[:-1]: 
    do_something(val) 
else: 
    do_something_else(array[-1]) 
+4

मैं आपको 'सूची' और 'iter' का उपयोग वैरिएबल नामों के रूप में करने के लिए सलाह देता हूं क्योंकि वे बिल्टिन –

+0

को छाया देते हैं, मैंने आपको +1 दिया है, लेकिन इटरेटर केस के लिए आपके पास कोड था। मैं अंदर जा रहा हूं और इसे ठीक कर रहा हूं। – steveha

+0

notlast के अपने पहले परिभाषा का एक सरल संस्करण: डीईएफ़ butlast (XS): पिछला = xs.next ( ) XS में एक्स के लिए: उपज पिछला पिछला = एक्स (मैं भी एक पहले जोड़ेंगे लाइन: xs = iter (xs)) –

27

तो

 
array = [1,2,3,4,5] 
for i, val in enumerate(array): 
    if (i+1) == len(array): 
    // Process for the last element 
    else: 
    // Process for the other element 
+5

+1 "के लिए/अन्य" के लिए +1, लेकिन ध्यान दें कि यदि "कुछ करें" कोड में वास्तव में ब्रेक स्टेटमेंट (लूप की प्रारंभिक समाप्ति) शामिल है तो अन्य कोड छोड़ा जाएगा। चाहे वह इस मामले में प्रासंगिक है ओपी तक है, लेकिन यह ध्यान दिया जाना चाहिए। –

+2

'for/else' –

6

itertools का उपयोग कर

>>> from itertools import repeat, chain,izip 
>>> for val,special in izip(array, chain(repeat(False,len(array)-1),[True])): 
...  print val, special 
... 
1 False 
2 False 
3 False 
4 False 
5 True 

किसी भी iterable पर काम करने के liori के जवाब का संस्करण

def last_flagged(seq): 
    seq = iter(seq) 
    a = next(seq) 
    for b in seq: 
     yield a, False 
     a = b 
    yield a, True   

mylist = [1,2,3,4,5] 
for item,is_last in last_flagged(mylist): 
    if is_last: 
     print "Last: ", item 
    else: 
     print "Not last: ", item 
-3
for i in items: 
    if i == items[-1]: 
    print 'The last item is: '+i 
+0

के लिए एक और +1 यह काम नहीं करता है जब विभिन्न तत्व' आइटम्स = [1,2,1] ' –

+1

में समान होते हैं, यह महंगा नहीं है? – IIllIIll

+0

यह तब काम करता है जब तत्व एक ही चर का उपयोग करते हैं तो तत्व कई बार सूची में होते हैं – HCLivess

-1

सरल तरीका एक है, तो शर्त के साथ (len() या टुकड़ा करने की क्रिया की आवश्यकता नहीं है):

for item in list: 
    print "Not last: ", item 
    if list.index(item) == len(list)-1: 
     print "Last: ", item 
संबंधित मुद्दे