选择满足条件的元素

met*_*eto 1 python performance list python-3.x

我想从(非常长)列表中选择满足条件的特定元素.在我的特定情况下,列表中的每个项目都是一个类,我想要的条件是,例如,item.id == 1.

我开始了

[item for item in collection if item.id == 1]
Run Code Online (Sandbox Code Playgroud)

但我不想遍历整个列表,因为我确信只有一个元素满足条件.

另一种选择是

def check(collection):
    for item in collection:
        if item.id == 1:
            return item
Run Code Online (Sandbox Code Playgroud)

有更有效的方法吗?Python 3是否具有内置功能?另一种选择可以是预处理列表以获得字典,例如

{item.id : item for item in collection}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 7

您可以使用生成器表达式next()函数:

item = next((item for item in collection if item.id == 1), None)
Run Code Online (Sandbox Code Playgroud)

这将找到集合中的第一个匹配元素,或者None如果没有匹配则返回.它不会迭代和评估任何超过查找一个元素的严格要求.

但是,如果你确实需要做很多事情,只需创建一次映射,然后查询每次都会更有效:

mapping = {item.id: item for item in collection}
item = mapping.get(1)
Run Code Online (Sandbox Code Playgroud)

因为这会将循环限制为仅一次,然后使用O(1)查找性能.这是一种记忆与速度的权衡.