找到/返回符合特定标准的第一个列表项的最优雅、最有效的方法是什么?

例如,如果我有一个对象列表,我想得到属性为obj.val==5的对象中的第一个对象.我当然可以使用列表理解,但这会导致O(n),如果n很大,这是浪费.一旦满足标准,我也可以使用break循环,但我认为可能会有一个更符合python/优雅的解决方案.

推荐答案

如果没有对象的任何其他索引或排序信息,则必须迭代,直到找到此类对象:

next(obj for obj in objs if obj.val == 5)

然而,这比完整的列表理解要快.将这两项进行比较:

[i for i in xrange(100000) if i == 1000][0]

next(i for i in xrange(100000) if i == 1000)

第一个需要5.75ms,第二个需要58.3µs(因为环路缩短了100倍,所以速度快了100倍).

Python相关问答推荐

在 django requests 模块中使用多值参数发出获取请求?

Pandas 判断两个数据框列并访问第三个值

在 Pandas 中使用列表索引创建列

使用 argparse 创建相互包含的参数

如何使用 Lambda 赋予 HTTP API 或 REST API 不更新的能力?

获取集群数量(3D)

绘制两个重叠的漏斗:代码不起作用

Pandas:将列表的列转换为单个列表

有没有办法在默认参数之后使用所需的参数? (就像默认的python range())

如何使用多个可选参数对函数进行类型重载?

Python ImportError: sys.meta_path is None, Python 可能正在关闭

如何进行条件合并 Pandas

Python集解包和模式匹配

如何在 map 中插入点

实现 tensorflow 对象检测模型时出错

如何加快 aiohttp 解析器 bs4?

Groupby 多列和 Sum - 使用添加的 If 条件创建新列

我在其中 1 列中有一个带有 json 子字符串的数据框.我想提取变量并为它们制作列

如何在不同的子图中绘制对,侧面有差异

Pandas :列的值,然后按相同的 ID 分组和合并