python - 如果我在生成器中手动向前查看,使我的枚举索引对应?

标签 python

>>> 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/

相关文章:

python - 两个 session key Flask 应用程序,很奇怪

python - 重复减去字符串和datetime.time

python - 元组、列表和集合定义中的星号,字典定义中的双星号

python - 聚合来自多个模块的多个测试用例以在 PyDev TestRunner 中运行

python - 如何将 Pandas Timestamp 转换为 Matplotlib 的 float64 格式?

python - 在 ubuntu 上安装 devstack kilo 时如何解决这个错误

python - 将单个 DataFrame 行分解为多个行

python - 阅读第 3 方模块的 Python 文档

python - 如何判断getLogger是否创建了一个新对象?

python 字典/列表理解 : why is it slower than for loop?