Python中查找iterable元素是否为最后一个元素的标准方法?

Python中查找iterable元素是否为最后一个元素的标准方法?,python,loops,iterator,Python,Loops,Iterator,如果我在Python的迭代器中循环,我如何才能知道now是否是最后一个元素?我正在寻找一些标准的库方法来实现这一点,也许是itertools中的一些函数,有这样的方法吗?或者其他一些很短的,类似于蟒蛇的方法 当然,我可以实现自己的助手生成器来完成此任务: 哪些产出: False 0 False 1 False 2 True 3 False 10 False 13 False 16 True 19 此外,如果我在简单范围内循环,我总是可以将其与上限进行比较(下面是正步骤的解决方案): 哪些

如果我在Python的迭代器中循环,我如何才能知道now是否是最后一个元素?我正在寻找一些标准的库方法来实现这一点,也许是
itertools
中的一些函数,有这样的方法吗?或者其他一些很短的,类似于蟒蛇的方法

当然,我可以实现自己的助手生成器来完成此任务:

哪些产出:

False 0
False 1
False 2
True 3
False 10
False 13
False 16
True 19
此外,如果我在简单范围内循环,我总是可以将其与上限进行比较(下面是正
步骤的解决方案
):

哪些产出:

False 0
False 1
False 2
True 3
False 10
False 13
False 16
True 19

对于简单范围的情况,上面这一点也是显而易见的,可能是最简单的解决方案,不幸的是,它需要在单独的变量中保持stop/step。但无论如何,这个案例并不是很有趣。对于任意迭代器,有没有一种python方法可以解决这个问题?

我以前用过类似的方法。这不是一个很好的解决方案,因为它很容易被误用,但它可以工作

def peek(itr: Iterator[T]) -> Tuple[Optional[T], Optional[Iterator[T]]]:
    """
    Return a pair of (first element of iterator, new iterator).  If iterator is exhausted, return (None, None).
    https://stackoverflow.com/a/664239/3282436

    NOTE: Because checking for values consumes part of the supplied iterator, that iterator is invalidated.  To continue
          iterating, you *must* use the iterator returned from peek.

    >>> itr = iter(range(3))
    >>> if recipes.peek(itr)[0] == 0:  # WRONG, itr will be missing first element
    >>>     # ...

    >>> itr = iter(range(3))
    >>> first, itr = recipes.peek(itr)  # Correct
    >>> if first == 0:
    >>>     # ...
    """
    try:
        first = next(itr)
    except StopIteration:
        return None, None
    return first, itertools.chain([first], itr)

没办法知道。有些迭代器没有最后一个元素,或者它们动态生成元素,所以在您尝试获取它之前无法判断。@Barmar我知道您必须获取它。这就是为什么我提供了自己的解决方案助手生成器
is_last()
,它可以提前获取元素。但我想知道在
itertools
库中是否有这样做的函数?Python中有多种形式的无限iterarators,例如
,而True:yield something
中没有最后一个元素。@dawg在查看了他的
is_last
迭代器之后,在这种情况下,他总是返回
false
。@dawg我不想得到最后一个元素。我只想知道当前元素是否是最后一个。如果它是无限迭代器,那么函数应该总是返回False,因为
是最后一个吗?