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

问题描述:

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

if elt is the last element: 
    do statement 

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

当循环结束时,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 
+4

只要在循环从不执行的情况下小心,因为这可能会导致一些疯狂的执行路径。 – carl 2010-01-13 17:47:10

+0

这是一个很好的观点。现在添加到我的答案。 – 2010-01-13 17:48:30

+1

只需删除代码以应用到'else'子句中的最后一个元素。 – 2010-01-13 17:52:13

你本身不可以。您需要存储当前项目,推进迭代器,并捕获StopIteration异常。然后你需要以某种方式表明你有最后一个项目。

+0

这不会很难做到,而且是一个更一般的解决方案,但对于当前任务来说并非完全必要。 – 2010-01-13 17:41:46

您可以通过使用iter.next()手动推进迭代器在while循环,然后捕捉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 
>>> 
+0

这是一种更通用的解决方案(即最后两个,最后三个,等等),但对于最后一个元素,我的解决方案是(恕我直言)更清洁。 – 2010-01-13 17:52:32

+6

您的解决方案代码较少,但IMO不那么明确,因为它依赖于非明显的范围规则。我更喜欢更明确的方法。 – 2010-01-13 18:29:43

我做了什么像这样:

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