【问题标题】:Pythonic way to skip items in an iterable?Pythonic 方式来跳过可迭代项中的项目?
【发布时间】:2017-03-05 17:24:23
【问题描述】:
假设我有一个可迭代的元素并且想要跳过元素,只要元素匹配特定的谓词。 我想影响当前的迭代器,而不是返回一个新的。
我可以这样做:
# untested, just for explanation
e = next(iterable)
while True:
if something(e):
e = next(iterable)
else:
break
但是有没有一个内置的函数,或者一些常见的习语?
【问题讨论】:
标签:
python
iterator
idioms
【解决方案2】:
为什么不直接
e = next(iterable)
while something(e):
e = next(iterable)
另外,为什么“我想影响当前的迭代器,而不是返回一个新的。”?我想不出你需要的场景。如果您允许一个新的迭代器来包装当前的迭代器,那么 wim 建议的 itertools.dropwhile 会更加 Pythonic(并且可读性强)。
【解决方案3】:
您的示例只是在第一个错误结果之后停止,所以这也是一样的:
>>> it = iter(range(100000)) # just constructing _an_ iterator
>>> next(itertools.filterfalse(lambda i: i != 12, it))
12
我不清楚究竟是什么——“我想影响当前的迭代器,而不是返回一个新的”是什么意思,但请注意 it 本身已经先进了:
>>> next(it)
13