我想要一种惯用的方式来查找列表中与谓词匹配的第一个元素.

当前的代码相当难看:

[x for x in seq if predicate(x)][0]

我想把它改成:

from itertools import dropwhile
dropwhile(lambda x: not predicate(x), seq).next()

但一定有更优雅的东西...如果它返回一个None的值,而不是在找不到匹配项时引发异常,那就更好了.

我知道我可以只定义如下函数:

def get_first(predicate, seq):
    for i in seq:
        if predicate(i): return i
    return None

但是,如果有内置函数已经提供了相同的功能,那么开始用这样的实用函数填充代码(人们可能不会注意到它们已经存在,所以它们往往会随着时间的推移而重复)是非常乏味的.

推荐答案

要查找序列seq中与predicate匹配的第一个元素:

next(x for x in seq if predicate(x))

或者简单地说:

Python 2:

next(itertools.ifilter(predicate, seq))

Python 3:

next(filter(predicate, seq))

如果谓词与任何元素都不匹配,则会引发StopIteration异常.


若要在没有此类元素的情况下返回None,请执行以下操作:

next((x for x in seq if predicate(x)), None)

或者:

next(filter(predicate, seq), None)

Python相关问答推荐

单击Cookie横幅错误并在Selenium中启用搜索栏

OdooElectron 商务产品详情页面中add_qty参数动态更新

如何在Pandas 中存储二进制数?

有没有方法可以修复删除了换码字符的无效的SON记录?

在Arrow上迭代的快速方法.Julia中包含3000万行和25列的表

是什么导致对Python脚本的jQuery Ajax调用引发500错误?

如何在PIL、Python中对图像应用彩色面膜?

具有症状的分段函数:如何仅针对某些输入值定义函数?

具有多个选项的计数_匹配

从webhook中的短代码(而不是电话号码)接收Twilio消息

Pandas实际上如何对基于自定义的索引(integer和非integer)执行索引

Pystata:从Python并行运行stata实例

ModuleNotFound错误:没有名为Crypto Windows 11、Python 3.11.6的模块

_repr_html_实现自定义__getattr_时未显示

如何使用LangChain和AzureOpenAI在Python中解决AttribeHelp和BadPressMessage错误?

如何将Docker内部运行的mariadb与主机上Docker外部运行的Python脚本连接起来

cv2.matchTemplate函数匹配失败

pandas在第1列的id,第2列的标题,第3列的值,第3列的值?

如何在Python中找到线性依赖mod 2

具有相同图例 colored颜色 和标签的堆叠子图