找到匹配条件的第一个序列项

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

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

277360 次浏览

如果你的对象没有任何其他索引或排序信息,那么你将不得不迭代,直到找到这样一个对象:

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倍)。

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))

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