gpt4 book ai didi

python - 任何可通过生成器迭代的最后 N 项

转载 作者:太空宇宙 更新时间:2023-11-03 14:01:09 25 4
gpt4 key购买 nike

我正在编写一个脚本,它将返回任何可迭代对象的最后 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))

但我每次都会遇到同样的错误:
类型错误:“生成器”对象不可订阅

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

最佳答案

您可以为此使用deque并将其maxlen指定为n:

from collections import deque

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

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

关于python - 任何可通过生成器迭代的最后 N 项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49238992/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com