2014-02-06 133 views
4

我想遍歷一個可迭代的對象(比方說,一個列表),並在某個時刻留下記住我停下來繼續下一次該對象的迭代器被調用的位置。有沒有辦法記住python迭代器中的位置?

喜歡的東西:

for val in list: 
    do_stuff(val) 
    if some_condition: 
     break 

do_stuff() 

for val in list: 
    continue_doing_stuff(val) 

速度問題,並認爲該列表是相當大的。因此,保存對象並重新遍歷整個列表直到找到保存的元素不是一個選項。這可能沒有寫一個明確的迭代器類的列表?

+2

如果我正確地跟着你,這就像是東西,可以用'iter'內置的函數來完成:HTTP://docs.python .org/2/library/functions.html#iter'iter'在迭代器上返回一個迭代器,它會在你跳出第一個for循環後保持狀態。 –

回答

4

正如彼得的意見建議,可以在iter()包裝一個迭代使其成爲一個迭代器:

a_list = ['a', 'b', 'c', 'd'] 
iter_list = iter(a_list) 

for val in iter_list: 
    print(val) # do_stuff(val) 
    if val == 'b': 
     break 

print('taking a break') 
# do_stuff() 

for val in iter_list: 
    print(val) #continue_doing_stuff(val) 

顯示:

a 
b 
taking a break 
c 
d 

我覺得這是最優雅的方式。

+0

感謝您制定完整的解決方案。 –

+0

謝謝,這就是我需要的! –

3

您可以使用發電機來做到這一點

def get_next(iterator): 
    for item in iterator: 
     yield item 

my_list_iterator = get_next(my_list) 

for val in my_list_iterator: 
    do_stuff(val) 
    if some_condition: 
     break 

do_stuff() 

for val in my_list_iterator: 
    continue_doing_stuff(val) 
+0

你可以擴展你從使用'iter'定義生成器看到的好處嗎?據我所知,'get_next'的行爲與'iter(my_list)'相同。這兩種方法都應該可以工作,但是我通常更喜歡在他們完成所需要的一切時使用內置函數。 –

+0

@PeterDeGlopper對於這個*特殊情況*,'iter'應該沒問題。 – thefourtheye

+0

謝謝,看起來我們普遍認同。我輕度不同意@yopy的評論:「這應該是答案」(儘管我不認爲這個答案是錯誤的 - 這是一個完全有效的方法),因爲我偏愛內建,也許我應該相應地解釋我的評論。他們之間的揀選看起來像是顯式聲明的行爲與內置行爲之間的選擇,這非常主觀。 –

相關問題