猿问

如果我在生成器中手动前瞻,使我的枚举索引相对应?

>>> gen = iter(['a','b','c','d'])

>>> for i, line in enumerate(gen):

...     print str(i) + ', ' + line

...     if (i == 1):

...         print 'saw 1'

...         print 'next: ' + gen.next()

...

0, a

1, b

saw 1

next: c

2, d

如您所见,我更愿意将3, d其理解为(如果愿意,我想保留一个不变式:因为还有其他原因enumerate?)是i对应于的索引line。在next()接管了转储。


遗憾的是,此尝试失败,i因为设置为for循环认为应该是:


>>> gen = iter(['a','b','c','d'])

>>> for i, line in enumerate(gen):

...     print str(i) + ', ' + line

...     if (i == 1):

...         print 'saw 1'

...         print 'next: ' + gen.next()

...         i = i + 1

...

0, a

1, b

saw 1

next: c

2, d

答案是什么?沟enumerate手动跟踪索引?我希望有一些高级程序可以适应这种控制流程。


我正在解析一个文件,偶尔需要读取下一行的内容(如果存在)(因此调用next()生成器),但是因此我不得不处理循环控制流。


因为我已经知道该怎么做,所以将不接受通过首先读出并完全评估生成器来做到这一点的答案(但请随时发布这样的答案,我会投票赞成)。


神不在的星期二
浏览 132回答 2
2回答

慕尼黑的夜晚无繁华

您可以一直使用enumerate迭代器。>>> gen = enumerate(['a','b','c','d'])>>> for i, line in gen:...     print str(i) + ', ' + line...     if (i == 1):...         print 'saw 1'...         print 'next: ' + gen.next()[1]...0, a1, bsaw 1next: c3, d注意在打印时访问元组第二个元素的索引next。您也可以放弃iter此方法的显式调用。如果希望显式调用iter以防enumerate更改行为,则应将其放在外面(因为要点是确保您正在处理迭代器):>>> gen = iter(enumerate(['a','b','c','d']))
随时随地看视频慕课网APP

相关分类

Python
我要回答