2014-02-11 48 views
1

有沒有一種簡單的方法來迭代一個允許指定終點(例如-1)的iterable對象,以及枚舉中的起始點。例如在枚舉python中包含stop參數的最簡單方法是什麼?

for i, row in enumerate(myiterable, start=2): # will start indexing at 2 

所以,如果我的對象有長度爲10,什麼是得到它開始於指數2迭代,並停止在指數9迭代最簡單的方法?

或者,是否有itertools更適合於此。我對高性能方法特別感興趣。

另外,當啓動選項在2.6中引入時,是否有任何理由停止選項不是?

乾杯

回答

4
for i, row in enumerate(myiterable, start=2): 
    if i>= limit: break 
    ... 

for i,row in itertools.takewhile(lambda (i,val):i < limit,enumerate(myiterable,2)): 

重新組織其他建議(請注意,如果您的迭代是可切片對象時,它只會工作)

start,stop = 11,20 
my_items = range(100) 
for i,row in enumerate(my_items[:stop-start],start): 
     .... 
+0

感謝@ Joran比斯利,兩者都是很好的選擇,非常有幫助。我知道明顯的回答是下一個問題是你自己進行基準測試,但是如果你認爲某種方法比另一種方法更快,你是否有任何暗示?或者更喜歡大型或小型物體等? –

+0

他們都短線路,所以他們應該在執行方面......或接近它... –

5

我想你誤會了'start'關鍵字,它不會跳轉到iterable中的第n個項目,它會從n開始計數,例如:

for i, c in enumerate(['a', 'b', 'c'], start=5): 
    print i, c 

給出:

5 a 
6 b 
7 c 

對於簡單iterables像列表和元組的最簡單和最快的方法將是這樣的:

obj = range(100) 
start = 11 
stop = 22 
for i, item in enumerate(obj[start:stop], start=start): 
    pass 
+0

哦方式來讀取行和給他的實際答案(+1)... –

+0

我明白它是什麼確實。即迭代從0開始的列表2將打印到i = 11,c = 9。也許我錯誤地表述了這個問題。但指出了。 –

相關問題