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