14

我一直在寻找一种优雅(简短!)的方式来返回列表中与特定标准匹配的第一个元素,而不必评估列表中每个元素的标准。最终我想出了:

(e for e in mylist if my_criteria(e)).next()

有更好的方法吗?

更准确地说:有内置的python函数,比如and——all()any()有类似的东西不是很有意义first()吗?出于某种原因,我不喜欢next()我的解决方案中的调用。

4

4 回答 4

13

怎么样:

next((e for e in mylist if my_criteria(e)), None)
于 2013-06-06T13:14:51.150 回答
10

不——看起来不错。我很想改写为:

from itertools import ifilter
next(ifilter(my_criteria, e))

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

blah = (my_function(e) for e in whatever)
next(blah) # possibly use a default value

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

from itertools import islice
val, = islice(blah, 1)

如果它是“空的”,那会给你一个ValueError例外

于 2013-06-06T13:15:15.950 回答
1

我建议使用

next((e for e in mylist if my_criteria(e)), None)

或者

next(ifilter(my_criteria, mylist), None)
于 2013-06-06T13:15:07.633 回答
0

带for循环

lst = [False,'a',9,3.0]
for x in lst:
    if(isinstance(x,float)):
        res = x
        break

print res
于 2013-06-06T13:29:23.107 回答