Python如何检查迭代器工具链中是否已到达最后一个元素?

Bru*_*uce 17 python

for elt in itertools.chain.from_iterable(node):

if elt is the last element:
  do statement
Run Code Online (Sandbox Code Playgroud)

我如何实现这一目标

Ste*_*lla 19

您可以通过在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
>>> 
Run Code Online (Sandbox Code Playgroud)

  • 您的解决方案代码较少,但IMO不太明确,因为它依赖于非显而易见的范围规则.我更喜欢更明确的方法. (6认同)

Chr*_*utz 10

当循环结束时,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
Run Code Online (Sandbox Code Playgroud)

  • 在循环永远不会执行的情况下要小心,因为这可能导致一些疯狂的执行路径. (4认同)
  • 只需删除要应用于“else”子句中最后一个元素的代码即可。 (2认同)