查找条件为true的第一个列表元素

Ale*_*ler 13 python python-2.7

我正在寻找一种优雅(简短!)的方式来返回匹配某个标准的列表的第一个元素,而不必评估列表中每个元素的条件.最终我提出了:

(e for e in mylist if my_criteria(e)).next()
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法呢?

更确切地说:有内置的python函数,如- all()any()- 也不是有意义first()吗?出于某种原因,我不喜欢next()我的解决方案中的电话.

iru*_*var 12

怎么样:

next((e for e in mylist if my_criteria(e)), None)
Run Code Online (Sandbox Code Playgroud)


Jon*_*nts 9

不 - 看起来很好.我很想重写,因为:

from itertools import ifilter
next(ifilter(my_criteria, e))
Run Code Online (Sandbox Code Playgroud)

或者至少将计算分解为生成器,然后使用:

blah = (my_function(e) for e in whatever)
next(blah) # possibly use a default value
Run Code Online (Sandbox Code Playgroud)

另一种方法,如果你不喜欢next:

from itertools import islice
val, = islice(blah, 1)
Run Code Online (Sandbox Code Playgroud)

ValueError如果它是"空的",这将给你一个例外

  • 对于那些在Python 3上看到它的人来说,`itertools.ifilter`现在只是`filter`并且在全局命名空间中可用。 (3认同)