for elt in itertools.chain.from_iterable(node):
if elt is the last element:
do statement
我該如何做到這一點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