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
你本身不可以。您需要存储当前项目,推进迭代器,并捕获StopIteration
异常。然后你需要以某种方式表明你有最后一个项目。
这不会很难做到,而且是一个更一般的解决方案,但对于当前任务来说并非完全必要。 – 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
>>>
这是一种更通用的解决方案(即最后两个,最后三个,等等),但对于最后一个元素,我的解决方案是(恕我直言)更清洁。 – 2010-01-13 17:52:32
您的解决方案代码较少,但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()
只要在循环从不执行的情况下小心,因为这可能会导致一些疯狂的执行路径。 – carl 2010-01-13 17:47:10
这是一个很好的观点。现在添加到我的答案。 – 2010-01-13 17:48:30
只需删除代码以应用到'else'子句中的最后一个元素。 – 2010-01-13 17:52:13