除了Python中迭代器的最后N个元素之外的所有元素

Zac*_*iel 6 python iterator

在Python中获取迭代器的最后N个元素的最佳方法是什么?以下是理论行动中的一个例子:

>>> list(all_but_the_last_n(range(10), 0))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(all_but_the_last_n(range(10), 2))
[0, 1, 2, 3, 4, 5, 6, 7]
Run Code Online (Sandbox Code Playgroud)

Ign*_*ams 6

用一个collections.deque.N在第一次调用时从源中推送项目.在每次后续调用时,弹出一个项目,从源中推送一个项目,然后生成弹出的项目.


sen*_*rle 6

只是为了它的乐趣,这里是Ignacio解决方案的变体,不需要双端队列.

>>> def truncate(it, n):
...     cache = [next(it) for i in range(n)]
...     index = 0
...     for val in it:
...         val, cache[index] = cache[index], val
...         index = (index + 1) % n
...         yield val
Run Code Online (Sandbox Code Playgroud)

当我写上面的内容时,我并不特别关心速度......但也许这会更快一点:

def truncate(it, n):
    cache = [next(it) for i in range(n)]
    index = 0
    for val in it:
        yield cache[index]
        cache[index] = val
        index = (index + 1) % n
Run Code Online (Sandbox Code Playgroud)