2010-01-13 3 views

Antwort

9

Wenn die Schleife endet, wird die Variable elt nicht aus dem Gültigkeitsbereich entfernt und behält immer noch den letzten Wert, den sie von der Schleife erhalten hat. Sie könnten also den Code am Ende der Schleife setzen und die Variable elt bearbeiten. Es ist nicht besonders schön, aber Pythons Scoping-Regeln sind auch nicht schön.

Das einzige Problem mit diesem (danke, cvondrick) ist, dass die Schleife nie ausgeführt werden könnte, was bedeuten würde, dass elt nicht existiert - wir würden eine NameError bekommen. So ist die volle Art und Weise grob zu tun wäre es:

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

Seien Sie vorsichtig, wenn die Schleife nie ausgeführt wird, da dies zu einem wilden Ausführungspfad führen könnte. – carl

+0

Das ist ein guter Punkt. Hinzufügen zu meiner Antwort jetzt. –

+1

Geben Sie einfach den Code für das letzte Element in der 'else'-Klausel ein. –

2

Sie können nicht per se. Sie müssten das aktuelle Element speichern, den Iterator vorrücken und die Ausnahme StopIteration abfangen. Und dann müssten Sie irgendwie signalisieren, dass Sie den letzten Gegenstand haben.

+0

Dies wäre nicht schwer zu tun, und ist eine allgemeinere Lösung, aber ist nicht ganz notwendig für die aktuelle Aufgabe. –

18

Sie können dies tun, indem Sie manuell den Iterator in einer while-Schleife fort iter.next() verwenden, dann die StopIteration Ausnahme abfangen:

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

Dies ist der Weg, es für eine allgemeinere Lösung zu tun (dh letzten zwei, letzten drei, etc.) aber für das letzte Element ist meine Lösung sauberer (IMHO). –

+6

Ihre Lösung hat weniger Code, aber IMO ist weniger explizit, da sie auf einer nicht offensichtlichen Scoping-Regel beruht. Ich bevorzuge den expliziteren Ansatz. –

1

ich etwas tun wie folgt:

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() 
Verwandte Themen