Pythonic方式跳过iterable中的项目?

时间:2016-10-24 02:20:46

标签: python iterator idioms

假设我有一个iterable,并且只要元素与特定谓词匹配就想跳过元素。 我想影响当前的迭代器,而不是返回一个新的

我可以这样做:

# untested, just for explanation

e = next(iterable)
while True:
    if something(e):
        e = next(iterable)
    else:
         break

但是有没有内置函数或者一些常见的习惯用法?

3 个答案:

答案 0 :(得分:3)

这是itertools.dropwhile的基本用例。

答案 1 :(得分:0)

为什么不

e = next(iterable)
while something(e):
  e = next(iterable)

另外,为什么“我想影响当前的迭代器,而不是返回一个新迭代器。”?当你需要时,我想不出一个场景。如果你允许一个新的迭代器来包装当前的迭代器,那么wim建议的itertools.dropwhile就更像Pythonic(并且可读)。

答案 2 :(得分:0)

你的例子只是在第一个错误结果之后停止,所以这样做:

>>> it = iter(range(100000)) # just constructing _an_ iterator
>>> next(itertools.filterfalse(lambda i: i != 12, it))
12

我不清楚 - 究竟是什么 - "我想影响当前的迭代器,而不是返回一个新的"意味着,但请注意it本身已经提升:

>>> next(it)
13