Python Как проверить, достиг ли последний элемент в цепочке инструментов итератора?
for elt in itertools.chain.from_iterable(node):
if elt is the last element:
do statement
Как достичь этого?
Ответ 1
Когда цикл завершается, переменная elt не выходит за пределы области видимости и сохраняет последнее значение, данное ему циклом. Таким образом, вы можете просто поместить код в конец цикла и работать с переменной elt. Это не очень красиво, но правила обзора Python тоже не очень хороши.
Единственная проблема с этим (спасибо, cvondrick) заключается в том, что цикл никогда не может выполняться, что означает, что elt не существует - мы получили бы NameError. Таким образом, полный способ сделать это будет примерно следующим:
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
Ответ 2
Вы можете сделать это, вручную продвигая итератор в цикле while с помощью iter.next(), а затем поймав исключение 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
>>>
Ответ 3
Вы не можете само по себе. Вам нужно будет сохранить текущий элемент, продвинуть итератор и поймать исключение StopIteration. И тогда вам нужно как-то сигнализировать, что у вас есть последний элемент.
Ответ 4
Я делаю что-то вроде этого:
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()