在Python中获取生成器的第n个项目

104 投票
10 回答
62446 浏览
提问于 2025-04-15 19:30

有没有更简洁的写法来表达以下内容呢?

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

撰写回答