2010-03-11 9 views
36

Ho bisogno di fare qualche operazione speciale per l'ultimo elemento in una lista. C'è un modo migliore di questo?Come trattare l'ultimo elemento nell'elenco in modo diverso in Python?

 
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 
+1

Possibile plicate di [Identifica quale iterazione ti trovi in ​​un loop in python] (http://stackoverflow.com/questions/4751092/identify-which-iteration-you-are-on-in-a-loop-in-python) –

risposta

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

Se non si vuole fare una copia della lista, è possibile fare un semplice generatore:

# 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] 

Un'altra definizione per notlast:

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

Non ti consiglio di usare 'list' e' iter' come nomi di variabili mentre ombreggiano i builtin –

+0

Ti ho dato +1, ma il codice che avevi lì per il caso iteratore non funzionava. Ho intenzione di entrare e aggiustarlo ora. – steveha

+0

Una versione più semplice della vostra prima definizione di notlast: def butlast (XS): prev = xs.next() for x in xs: rendimento prec prev = x (Vorrei anche aggiungere una prima line: xs = iter (xs)) –

27

Se la tua sequenza non è terribilmente lunga, quindi puoi semplicemente tagliarla:

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

+1 per "per/else", ma si noti che se il codice "fa qualcosa" in realtà implica un'istruzione break (terminazione anticipata del ciclo), il codice else verrà saltato. Se questo è rilevante in questo caso è fino all'OP, ma dovrebbe essere notato. –

+2

Un altro +1 per 'for/else' –

6

utilizzando 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 

versione della risposta di Liori di lavorare su qualsiasi iterabile (non richiede len() o affettare)

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

Questo non funziona quando elementi diversi sono gli stessi come in' items = [1,2,1] ' –

+1

Non è costoso? – IIllIIll

+0

Funziona quando gli elementi sono presenti nell'elenco più volte se si utilizza una singola variabile – HCLivess

-1

modo semplice con una condizione if:

for item in list: 
    print "Not last: ", item 
    if list.index(item) == len(list)-1: 
     print "Last: ", item 
Problemi correlati