for elt in itertools.chain.from_iterable(node):
if elt is the last element:
do statement
Wie erreiche ich diesesPython Wie überprüfe ich, ob das letzte Element in der Iterator-Werkzeugkette erreicht wurde?
for elt in itertools.chain.from_iterable(node):
if elt is the last element:
do statement
Wie erreiche ich diesesPython Wie überprüfe ich, ob das letzte Element in der Iterator-Werkzeugkette erreicht wurde?
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
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.
Dies wäre nicht schwer zu tun, und ist eine allgemeinere Lösung, aber ist nicht ganz notwendig für die aktuelle Aufgabe. –
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
>>>
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). –
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. –
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()
Seien Sie vorsichtig, wenn die Schleife nie ausgeführt wird, da dies zu einem wilden Ausführungspfad führen könnte. – carl
Das ist ein guter Punkt. Hinzufügen zu meiner Antwort jetzt. –
Geben Sie einfach den Code für das letzte Element in der 'else'-Klausel ein. –