一尘不染

通过谓词过滤Python列表

python

我想做类似的事情:

>>> lst = [1, 2, 3, 4, 5]
>>> lst.find(lambda x: x % 2 == 0)
2
>>> lst.findall(lambda x: x % 2 == 0)
[2, 4]

Python的标准库中是否有类似行为?

我知道在这里自己动手很容易,但是我正在寻找一种更标准的方法。


阅读 218

收藏
2020-12-20

共1个答案

一尘不染

您可以使用filter方法:

>>> lst = [1, 2, 3, 4, 5]
>>> filter(lambda x: x % 2 == 0, lst)
[2, 4]

或列表理解:

>>> lst = [1, 2, 3, 4, 5]
>>> [x for x in lst if x %2 == 0]
[2, 4]

要查找单个元素,可以尝试:

>>> next(x for x in lst if x % 2 == 0)
2

尽管如果没有匹配项将引发异常,因此您可能希望将其包装在try / catch中。方括号()使之成为生成器表达式,而不是列表理解。

就我个人而言,尽管我只是使用常规的过滤器/理解并采用第一个元素(如果有)。

如果什么也没找到,就会引发异常

filter(lambda x: x % 2 == 0, lst)[0]
[x for x in lst if x %2 == 0][0]

这些返回空列表

filter(lambda x: x % 2 == 0, lst)[:1]
[x for x in lst if x %2 == 0][:1]
2020-12-20