【问题标题】:Last N items of any iterable via generator任何可通过生成器迭代的最后 N 项
【发布时间】: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


【解决方案1】:

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

from collections import deque

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

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

【讨论】:

猜你喜欢
  • 2011-01-07
  • 2020-10-06
  • 1970-01-01
  • 2021-09-30
  • 2018-05-16
  • 2010-12-27
  • 2016-01-20
  • 2019-09-02
  • 1970-01-01
相关资源
最近更新 更多