2010-01-13 7 views

Répondre

9

Lorsque la boucle se termine, la variable elt ne sort pas de la portée et conserve la dernière valeur qui lui est attribuée par la boucle. Donc, vous pouvez simplement mettre le code à la fin de la boucle et opérer sur la variable elt. Ce n'est pas très joli, mais les règles de portée de Python ne sont pas non plus très bien.

Le seul problème avec ceci (merci, cvondrick) est que la boucle pourrait ne jamais s'exécuter, ce qui signifierait que elt n'existe pas - nous aurions un NameError. Ainsi, la manière pleine de le faire serait à peu près:

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

Soyez prudent dans le cas où la boucle ne s'exécute jamais car cela pourrait conduire à un chemin d'exécution sauvage. – carl

+0

C'est un bon point. Ajoutant cela à ma réponse maintenant. –

+1

Il suffit de supprimer le code à appliquer au dernier élément de la clause 'else'. –

2

Vous ne pouvez pas en tant que tel. Vous devez stocker l'élément actuel, avancer l'itérateur et attraper l'exception StopIteration. Et puis vous auriez besoin de signaler en quelque sorte que vous avez le dernier objet.

+0

Cela ne serait pas difficile à faire, et est une solution plus générale, mais n'est pas entièrement nécessaire pour la tâche en cours. –

18

Vous pouvez le faire en faisant avancer manuellement le iterator dans une boucle en utilisant iter.next(), attrapant alors l'exception 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

C'est la manière de le faire pour une solution plus générale (ie deux derniers, trois derniers, etc.) mais pour le dernier élément, ma solution est (à mon humble avis) plus propre. –

+6

Votre solution a moins de code, mais l'OMI est moins explicite car elle repose sur une règle de portée non évidente. Je préfère l'approche plus explicite. –

1

je fais quelque chose comme ceci:

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() 
Questions connexes