2

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

4

2 回答 2

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
于 2013-10-06T20:21:41.217 回答
1

如果您想允许任何生成器(或任何可迭代),不仅没有简单的方法,而且根本没有方法。一般来说,没有办法知道你距离一个生成器的末尾还有 10 个项目,甚至无法知道生成器是否有结束。生成器一次只给你一个项目,并没有告诉你有多少项目是“剩余的”。您必须遍历整个生成器,保留最近 10 个项目的临时缓存,然后在(或如果!)生成器终止时产生这些项目。

注意“或如果”。生成器不必是有限的。对于无限生成器,没有“最后”10 个元素这样的东西。

于 2013-10-06T20:07:16.577 回答