【发布时间】:2018-03-12 15:32:59
【问题描述】:
我正在编写一个脚本,它将任何可迭代的最后 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))
我想做最后一个改变。如果迭代很大,比如 range(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:“生成器”对象不可下标
如何修改我的脚本以迭代生成器而不是列表,以便生成相同的输出(必须是列表)而不创建大的 可预先迭代。
【问题讨论】:
-
你不能只得到最后一个 n。您必须按顺序使用生成器,计算最后一个 n 之前的所有内容
标签: python python-3.x generator