Python Как проверить, был ли достигнут последний элемент в цепочке инструментов итератора? - PullRequest
17 голосов
/ 13 января 2010
for elt in itertools.chain.from_iterable(node):

if elt is the last element:
  do statement

Как мне этого добиться

Ответы [ 4 ]

19 голосов
/ 13 января 2010

Вы можете сделать это, вручную перемещая итератор в цикле 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
>>> 
10 голосов
/ 13 января 2010

Когда цикл заканчивается, переменная 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 голосов
/ 13 января 2010

Вы не можете сами по себе.Вам нужно сохранить текущий элемент, продвинуть итератор и поймать исключение StopIteration.И тогда вам нужно как-то сигнализировать, что у вас есть последний элемент.

1 голос
/ 01 декабря 2012

Я делаю что-то вроде этого:

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...