2014-02-06 85 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的评论:“这应该是答案”(尽管我不认为这个答案是错误的 - 这是一个完全有效的方法),因为我偏爱内建,也许我应该相应地解释我的评论。他们之间的拣选看起来像是显式声明的行为与内置行为之间的选择,这非常主观。 –

相关问题