【问题标题】:continuing an iterator with a different iterator without affecting the first one [duplicate]在不影响第一个迭代器的情况下使用不同的迭代器继续迭代器[重复]
【发布时间】:2019-01-12 16:09:32
【问题描述】:

我正在使用iter 函数创建一个迭代器,并使用该迭代器迭代几个步骤。

然后我想用不同的迭代器从同一个地方继续迭代,而不影响原来的迭代器对象。

示例:

考虑迭代器对象org_iter

>>> a = [1,2,3,4,5]
>>> org_iter = iter(a)

遍历它:

>>> next(org_iter)
1

再次使用iter 会给出相同的迭代器实例,而不是来自同一位置的不同实例:

>>> new_iter = iter(org_iter)
>>> next(new_iter)  # continuing 
2
>>> next(org_iter)  # "org_iter is new_iter"
3

因评论而编辑:使用 itertools.tee 也不起作用:

>>> new_iter = itertools.tee(org_iter)
>>> next(new_iter[0])
2
>>> next(org_iter)
3

可以通过使用不同的变量来保存索引号并+=1ing 来实现相同的功能。

或使用enumerate 函数和嵌套的for 循环。

但我特别问的是直接使用迭代器对象。

【问题讨论】:

  • 您错误地使用了tee。你会做it1, it2=itertools.tee(iter(a)) 然后它会按你的预期工作。一旦你使用了tee,你就不能再使用原来的迭代器了。
  • 这不允许我从与原始迭代器相同的位置继续,我必须在开始时创建它们并迭代它们,这不是我的问题。我正在动态创建迭代器,我不知道我需要多少。
  • 再次:只要您不使用原件,它就会按预期工作。尝试:oi=iter(a) 几个下一个然后执行 i1,i2=itertools.tee(iter(oi)) 并且此时不要使用 oii1i2 现在是 oi 所在的位置,并且可以从那里独立使用。
  • 如果不清楚,也可以重用原来的名字:oi,new_i=itertools.tee(iter(oi)),这样在功能上和保持原来是一样的。

标签: python iterator


【解决方案1】:

我能想到的一种不使用任何外部模块的方法是:

>>> a = [1, 2, 3, 4, 5]
>>> org_iter = iter(a)
>>> id(org_iter)
58713584
>>> new_iter = iter(list(org_iter))
>>> id(new_iter)
58299600

【讨论】:

  • 这破坏了org_iter,做next(org_iter)给我StopIteration异常。
猜你喜欢
  • 2014-08-07
  • 1970-01-01
  • 2018-12-31
  • 2018-09-23
  • 1970-01-01
  • 2012-03-02
  • 2015-09-20
  • 2018-07-10
  • 2012-03-23
相关资源
最近更新 更多