任何可迭代的生成器的最后N项

时间:2018-03-12 15:33:00

标签: python python-3.x generator

我正在编写一个脚本,它将任何可迭代的最后N个项作为列表返回。

以下是有效的:

a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
b = (n**2 for n in range(10))


def tail(iterable, n):
    x = list(iterable)
    if n < 0:
        return []
    else:
        return list(x[-n:])


print(tail(b, 3))
print(tail(a, 4))

我想做最后一次改变。如果迭代是巨大的,比如范围(10000000),我不想预先生成整个列表。

我想要节省内存,即使用生成器。

我做了几次尝试,包括:

a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
b = (n**2 for n in range(10))


def tail(iterable, n):
    if n < 0:
        return []
    else:
        return list([(yield x) for x in iterable][-n:])


print(tail(b, 3))

但我每次都遇到同样的错误:
    TypeError:&#39; generator&#39;对象不可订阅

如何修改我的脚本以迭代生成器而不是列表,以便生成相同的输出(必须是列表)而不会创建大的 可以在前面迭代。

1 个答案:

答案 0 :(得分:1)

您可以使用deque来指定maxlenn

from collections import deque

def tail(iterable, n):
    if n < 0:
        return []
    else:
        return deque(iterable, n)

return包裹在list调用中,以便在需要时将结果作为列表返回。 deque不会从迭代器中创建中间列表,从而降低空间复杂度。