在Python中获取生成器的第n个项目
有没有更简洁的写法来表达以下内容呢?
gen = (i for i in xrange(10))
index = 5
for i, v in enumerate(gen):
if i is index:
return v
看起来,生成器应该有一个 gen[index]
的写法,就像列表一样,但它的功能和上面的代码是一样的。
10 个回答
17
你可以这样做,使用 count
作为示例生成器:
from itertools import islice, count
next(islice(count(), n, n+1))
19
我觉得最好的方法是:
next(x for i,x in enumerate(it) if i==n)
(这里的 it
是你的迭代器,n
是索引)
这个方法不需要你添加额外的导入(像使用 itertools
的解决方案那样),也不需要一次性把迭代器里的所有元素都加载到内存中(像使用 list
的解决方案那样)。
注意1:这个版本如果你的迭代器里少于 n 个项目,会抛出一个 StopIteration
错误。如果你想要得到 None
,可以使用:
next((x for i,x in enumerate(it) if i==n), None)
注意2:在调用 next
时没有括号。这不是列表推导式,而是生成器推导式,它不会消耗原始迭代器超过第 n 个元素。
106
一种方法是使用 itertools.islice
。
>>> gen = (x for x in range(10))
>>> index = 5
>>> next(itertools.islice(gen, index, None))
5