2010-03-11 21 views
36

Necesito hacer alguna operación especial para el último elemento en una lista. ¿Hay alguna manera mejor que esto?¿Cómo tratar el último elemento de la lista de manera diferente en 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

Posible du plicate of [Identifique en qué iteración se encuentra en un bucle en python] (http://stackoverflow.com/questions/4751092/identify-which-iteration-you-are-on-in-a-loop-in-python) –

Respuesta

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

Si no desea hacer una copia de la lista, se puede hacer un simple generador:

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

Otra definición para notlast:

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

Te aconsejo que no uses 'list' y' iter' como nombres de variables ya que sombrean los builtins –

+0

Te di +1, pero el código que tenías allí para el caso del iterador no funcionó. Voy a entrar y arreglarlo ahora. – steveha

+0

Una versión más simple de la primera definición de notlast: def butlast (XS): prev = xs.next() para x en xs: prev rendimiento prev = x (me gustaría añadir también un primer línea: xs = iter (xs)) –

27

Si su secuencia no es demasiado larga, entonces puede simplemente cortarla:

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

+1 para "for/else", pero tenga en cuenta que si el código "hacer algo" en realidad implica una declaración de interrupción (terminación anticipada del ciclo), entonces se omitirá el código else. Si eso es relevante en este caso depende del OP, pero debe tenerse en cuenta. –

+2

Otro +1 para 'para/else' –

6

utilizando 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 

versión de la respuesta de Liori para trabajar en cualquier iterable (no requiere len() o rebanado)

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

Esto no funciona cuando los diferentes elementos son los mismos que en' items = [1,2,1] ' –

+1

¿No es esto caro? – IIllIIll

+0

Funciona cuando los elementos están en la lista varias veces si usa una sola variable – HCLivess

-1

manera simple con un if condición:

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