找到/返回第一个匹配某个条件的列表项的最优雅和有效的方法是什么?

例如,如果我有一个对象列表,我想获得属性为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倍)。


如果找到,它会返回对象,否则返回"not found"

a = [100, 200, 300, 400, 500]

def search(b):
    try:
        k = a.index(b)
        return a[k] 
    except ValueError:
        return 'not found'

print(search(500))