问题描述
Python 2.6+ 和 Python 3:
如果您想stopiteration
在没有找到匹配元素的情况下被提升:
next(x for x in the_iterable if x > 3)
如果您希望default_value
(例如None
)被退回:
next((x for x in the_iterable if x > 3), default_value)
请注意,在这种情况下,您需要在生成器表达式周围添加一对额外的括号——只要生成器表达式不是唯一的参数,就需要它们。
我看到大多数答案都坚决地忽略了next
内置的,所以我假设出于某种神秘的原因,他们
100% 专注于 2.5 版和更早的版本——没有提到 Python 版本问题(但我在 确实
提到内置的答案next
,这就是为什么我认为有必要自己提供答案 - 至少“正确版本”问题以这种方式记录在案;-)。
Python <= 2.5
如果迭代器立即完成,迭代器的.next()
方法会立即引发stopiteration
-
即,对于您的用例,如果可迭代对象中没有项目满足条件。如果您不关心(即,您知道
至少有一个令人满意的项目),那么只需使用.next()
(最好在 genexp 上,用于next
Python 2.6 和更好的内置行)。
如果您 确实 在意,最好按照您在 Q
中首先指出的那样将内容包装在一个函数中,虽然您提出的函数实现很好,但您也可以使用itertools
、for...: break
循环或 genexp
或 atry/except
stopiteration
作为函数的主体,正如各种答案所建议的那样。这些替代方案中的任何一个都没有太多附加值,因此我会选择您最初提出的极其简单的版本。
解决方法
我想从匹配条件的列表中获取第一项。生成的方法不处理可能非常大的整个列表,这一点很重要。例如,以下函数就足够了:
def first(the_iterable,condition = lambda x: True):
for i in the_iterable:
if condition(i):
return i
这个函数可以像这样使用:
>>> first(range(10))
0
>>> first(range(10),lambda i: i > 3)
4
但是,我想不出一个好的内置/单线让我这样做。如果不需要的话,我并不特别想复制这个功能。有没有一种内置的方法来获取第一个匹配条件的项目?