【问题标题】:Get only the last element of an iterator in the most Pythonic way [duplicate]以最Pythonic的方式仅获取迭代器的最后一个元素[重复]
【发布时间】:2019-10-19 22:55:27
【问题描述】:

如何获取迭代器的最后一个元素?我知道我必须耗尽迭代器并返回它产生的最后一个值,所以简单的方法是:

def last(it):
    for value in it:
        pass
    return value

(您可能想捕捉NameError 并为空输入提出其他内容,但您明白了。)

有没有我没有想到的更简单的解决方案,例如。 G。使用itertools.islice()(不过它似乎不接受负索引)或类似的东西?

【问题讨论】:

  • 您可以参考here

标签: python iterator


【解决方案1】:

也许你可以使用

list(it)[-1]

it 是迭代器。

您将其转换为列表并获取最后一个元素。

【讨论】:

  • 这会将所有元素短暂地存储在内存中,只是为了最终得到最后一个。
【解决方案2】:

更简单的解决方案是使用Extended Iterable Unpacking

*_, last = it

例子:

it = range(10)
*_, last = it
print(last)
# 9

【讨论】:

  • 您确定range() 返回的是迭代器而不是列表吗?
  • @Gsk isinstance(range(10), list)
  • 不幸的是,它接近list(it)[-1],它同时将所有元素保存在内存中(您的解决方案将它们短暂存储在_)。
  • @yatu 抱歉,问题的措辞有误:range() returns an iterable, not an iterator。我只是好奇,我觉得你的回答很有趣
【解决方案3】:

这不是一种pythonic方式,而只是其他一些解决方案。如果您可以使用toolz。然后您可以执行以下操作。

from toolz import last

last(it)

【讨论】:

    【解决方案4】:

    以下比

    快约 26%
    def last(it):
        for value in it:
            pass
        return value
    

    因为它在解释器之外进行迭代:

    import collections
    def last(iterator):
        return collections.deque(iterator, maxlen=1).pop()
    

    如果双端队列为空,则会引发 IndexError,否则返回最后一个值。

    这个想法来自 itertools 模块中的消费示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-04
      • 2018-11-28
      • 2023-01-05
      • 1970-01-01
      • 2013-02-20
      • 2021-06-26
      • 2015-09-14
      • 2011-02-10
      相关资源
      最近更新 更多