1
>>> 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()生成器),但结果我必须处理循环控制流。

因为我已经知道如何做到这一点,所以通过首先读出并全面评估生成器来做到这一点的答案将不被接受(但请随意发布这样的答案,我会支持它)。

4

2 回答 2

5

您可以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']))
于 2013-06-05T04:45:53.637 回答
0

尝试这样的事情:

gen = iter(['a','b','c','d'])
i = 0
for line in gen:
    print str(i) + ', ' + line
    i += 1
    if (i == 1):
        print 'saw 1'
        print 'next: ' + gen.next()
        i += 1

如果您可以将迭代器转换为列表,则可以使逻辑更简单,因为您可以迭代从 0 到 len-1 的索引并只增加索引,而不需要跟踪生成器的位置以及对应的索引to(这可能导致不匹配的错误)。

于 2013-06-05T04:43:44.363 回答