索引形成生成器的末尾

时间:2013-10-06 20:03:36

标签: python generator itertools

假设我在Python中有一个生成器,我想迭代其中的所有内容,除了前10次迭代和最后10次迭代。 itertools.islice支持切片操作的第一部分,但不支持第二部分。有没有一种简单的方法来实现这一目标?

2 个答案:

答案 0 :(得分:2)

这样的事情可能会起到作用。编辑:根据评论添加了deque的使用。

from collections import deque
def generator():
    for i in ['ignore'] * 10 + ['yield this'] * 10 + ['ignore'] * 10:
        yield i


def func(mygenerator):
    cache = deque()
    for i, item in enumerate(mygenerator()):
        if i < 10:
            continue
        cache.appendleft(item)
        if len(cache) > 10:
            yield cache.pop()

for i in func(generator):
    print i

答案 1 :(得分:1)

如果你想允许任何生成器(或任何可迭代的),不仅没有一种简单的方法,根本没有办法。一般来说,无法知道您何时从发电机的末端开始10个项目,或者甚至无法知道发电机是否有结束。生成器一次只能给你一件物品,并且不会告诉你有多少物品是“剩下的”。您必须遍历整个生成器,保留最近10个项目的临时缓存,然后在生成器终止时(或者如果!)生成它们。

请注意“或如果”。发电机不必是有限的。对于无限生成器,没有“最后”10个元素。