find符合条件的第一个序列项目

find/返回符合某个标准的第一个列表项目最优雅和有效的方式是什么?

例如,如果我有一个对象的列表,我想获得属性obj.val==5的第一个对象。 我当然可以使用列表理解,但是会产生O(n),如果n很大,这是浪费的。 一旦达到标准,我也可以使用一个循环,但我认为可能会有一个pythonic /优雅的解决scheme。

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

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

它会返回对象,如果发现其他将返回“找不到”