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