2010-01-13 14 views

Respuesta

9

Cuando termina el ciclo, la variable elt no se sale del alcance, y aún conserva el último valor que le dio el ciclo. Entonces podría poner el código al final del ciclo y operar en la variable elt. No es terriblemente bonito, pero las reglas de alcance de Python tampoco son bonitas.

El único problema con esto (gracias, cvondrick) es que el bucle podría no ejecutarse, lo que significaría que elt no existe - obtendríamos un NameError. Así que la forma completa de hacerlo sería aproximadamente:

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

Solo tenga cuidado en el caso en que el bucle nunca se ejecute ya que esto podría llevar a una ruta de ejecución salvaje. – carl

+0

Ese es un buen punto. Agregando eso a mi respuesta ahora. –

+1

Simplemente suelte el código para aplicarlo al último elemento en la cláusula 'else'. –

2

No se puede per se. Debería almacenar el elemento actual, avanzar el iterador y detectar la excepción StopIteration. Y entonces necesitarías señalar de alguna manera que tienes el último artículo.

+0

Esto no sería difícil de hacer, y es una solución más general, pero no es del todo necesaria para la tarea actual. –

18

Usted puede hacer esto mediante el avance manualmente el iterador en un bucle durante el uso de iter.next(), a continuación, para controlar el StopIteration excepción:

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

Esta es la manera de hacerlo para una solución más general (es decir, los dos últimos, los últimos tres, etc.) pero para el último elemento, mi solución es (en mi humilde opinión) más limpia. –

+6

Su solución tiene menos código, pero IMO es menos explícita ya que se basa en una regla de ámbito no obvio. Prefiero el enfoque más explícito. –

1

hago algo como este:

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() 
Cuestiones relacionadas