2010-01-13 23 views

回答

9

當循環結束時,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

2

你本身不可以。您需要存儲當前項目,推進迭代器,並捕獲StopIteration異常。然後你需要以某種方式表明你有最後一個項目。

+0

這不會很難做到,而且是一個更一般的解決方案,但對於當前任務來說並非完全必要。 – 2010-01-13 17:41:46

18

您可以通過使用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

1

我做了什麼像這樣:

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() 
相關問題