如何解决如何获得除可迭代的最后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个元素
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。