问题描述
def drop(iterable,n):
iterator = iter(iterable)
iter_list = []
try:
while True:
it = next(iterator)
if len(iter_list) <= n:
iter_list.append(it)
yield it
except stopiteration:
pass
我想从迭代器中产生所有值,除了最后n个值。现在,我拥有它,使其最多产生n个值。我该怎么做,以至于反过来呢?如果可以的话,我想保持相同的结构。
我不允许计算可迭代产生的值的数量。我也不能使用itertools或在可迭代对象上调用len,index,slice等。
解决方法
from collections import deque
def drop(it,n):
queue = deque()
for _ in range(n):
queue.append(next(it))
while True:
# If next(it) throws a StopIteration,we need a little bit more
# code here to indicate this iterable if finished.
queue.append(next(it))
yield queue.popleft()
我可能需要添加几个try / stopstop除外,以使其完美运行,但这是基本思想。
,这里有2个选项,首先是生成整个可迭代对象并删除最后一个n,在while循环中,您从头开始或使用n值缓冲区的更聪明方法返回每个值。只需对您的代码稍作修改即可达到目的
def drop(iterable,n):
iterator = iter(iterable)
iter_list = []
try:
while True:
it = next(iterator)
iter_list.append(it)
if len(iter_list) > n:
element = iter_list.pop(0)
yield element
except StopIteration:
pass
这里,每个新元素都被添加到while循环中,并且yield元素的条件在生成前n个元素之后运行。然后产生第一个生成的元素,依此类推,始终生成n个元素。当迭代器没有更多内容可提供时,引发异常,而while循环停止保留从不返回的最后n个元素