>>> 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
serve?) 是i
对应行
的索引。 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()
)但是我必须处理循环控制流因此。
因为我已经知道如何去做,所以通过先读出并全面评估生成器来做到这一点的答案将不会被接受(但请随意发布这样的答案,我会赞成它)。
最佳答案
您可以一直使用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, a
1, b
saw 1
next: c
3, d
注意在打印next
时访问元组第二个元素的索引。您也可以通过这种方式放弃对 iter
的显式调用。如果你想显式调用 iter
以防 enumerate
的行为发生变化,你应该把它放在外面(因为重点是确保你处理迭代器):
>>> gen = iter(enumerate(['a','b','c','d']))
关于python - 如果我在生成器中手动向前查看,使我的枚举索引对应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16931661/