从迭代器中排除第一个元素(Python)

波顿

我有一个生成器函数A

例如(实际上我有一个更复杂的功能A),

def A():
    yield from [i**2 for i in range(20)]

编写另一个生成器函数B,我想枚举A除第一个元素外的所有返回元素。

在Python 3中有哪些简单的方法可以实现此目的?

阿巴内特

通常,您不需要在表达式中使用它,因此您只需调用next(it),而忽略结果即可消耗和丢弃第一个元素。


但是,如果迭代器可能为空,则必须决定要发生的事情:

  • 也许您想加注StopIteration,在这种情况下next(it)可以。
  • 也许您想提出其他建议,在这种情况下,您可以next(it)进入except StopIteration: raise SomethingElse()
  • 也许您只是想让迭代器为空,在这种情况下,您可以调用next(it, None)

您可以在stdlib和docs中找到这些示例。例如,如果您浏览中的配方itertools

def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = tee(iterable)
    next(b, None)
    return zip(a, b)

这正是您想要做的—跳过的第一个元素b如果iterable为空,则您不希望在这里出错;您只想不进行任何迭代。因此,next(b, None)


如果您需要在表达式中间执行此操作怎么办?

然后,您可以编写一个跳过第一个元素的函数:

def skip_first(iterable):
    it = iter(iterable)
    next(it, None)
    return it

(同样,您必须决定要为空的可迭代对象进行的操作。)

这将返回迭代器的第一个跳过版本,因此您可以内联使用它。(它发生变异的迭代器是传入的,当然,但你通常只在一个临时的值,你没有保留任何引用来使用,所以这不是一个问题。)

或者,如果您需要返回一个生成器而不是一个任意迭代器(通常不需要):

def skip_first(iterable):
    it = iter(iterable)
    next(it, None)
    yield from it

或者,您可以使用相同想法的更通用版本itertools.islice以下具有相同的效果:

it = skip_first(it)
it = itertools.islice(it, 1, None)

当我们使用itertools食谱时,值得一看consume

def consume(iterator, n=None):
    "Advance the iterator n-steps ahead. If n is None, consume entirely."
    # Use functions that consume iterators at C speed.
    if n is None:
        # feed the entire iterator into a zero-length deque
        collections.deque(iterator, maxlen=0)
    else:
        # advance to the empty slice starting at position n
        next(islice(iterator, n, n), None)

忘记None部分;有趣的是,它会跳过n带有islice和的元素next(请注意,它是iterator就地变异,不返回任何内容。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

角度过滤数组,但从过滤器中排除第一个元素

从包装中排除第一个弹性项目

从第一个表中排除值的并集

为什么boost :: python迭代器会跳过第一个元素?

为什么`zip`从第一个迭代器中又吃了一个元素?

如何在delphi中排除用作数组索引的枚举类型的第一个元素?

从SQL查询中排除第一个和最后一个结果

迭代Python列表中的连续元素,以使最后一个元素与第一个元素结合

获取与迭代器函数匹配的集合的第一个元素

比较不同的向量迭代器并从第一个向量中擦除元素

为什么这个java迭代器循环也打印第一个元素?

获取异步迭代的第一个元素

接受迭代器并返回迭代器中第一个可被 2 整除的元素的函数

在.each中排除一个元素

MySQL:找到重复的记录,但从列表中排除第一个

如何从选择中排除段落的第一个字符?

排除最后一个元素的迭代器

排除数组的第一个和最后一个元素

第一个元素的CSS选择器

是否有一种简单的单行方式来排除 Python 中范围函数的第一个元素?

在自定义反向矢量迭代器中,看不到第一个元素

为什么对多个流进行迭代仅对第一个元素进行迭代?

std :: vector在最后一个之后使用第一个迭代器擦除

python-如何在张量流中迭代每个嵌套张量的第一个元素,python?

Python:嵌套列表中的第一个元素

python - 从元组中提取第一个元素

遍历Python列表,但第一个元素在末尾?

从Python元组中弹出第一个元素

更改每组 Python 列表的第一个元素