我正在编写一个脚本,它将任何可迭代的最后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;对象不可订阅
如何修改我的脚本以迭代生成器而不是列表,以便生成相同的输出(必须是列表)而不会创建大的 可以在前面迭代。
答案 0 :(得分:1)
您可以使用deque
来指定maxlen
到n
:
from collections import deque
def tail(iterable, n):
if n < 0:
return []
else:
return deque(iterable, n)
将return
包裹在list
调用中,以便在需要时将结果作为列表返回。 deque
不会从迭代器中创建中间列表,从而降低空间复杂度。