如何获得除可迭代的最后n个值以外的所有值

问题描述

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个元素