找到/返回符合特定标准的第一个列表项的最优雅和有效的方法是什么?
例如,如果我有一个对象列表,我想得到属性的第一个对象obj.val==5
.我当然可以使用列表理解,但这会产生O(n),如果n很大,那就太浪费了.break
一旦达到标准,我也可以使用循环,但我认为可能有更多的pythonic /优雅解决方案.
eum*_*iro 508
如果您没有任何其他索引或对象的已排序信息,则必须迭代直到找到这样的对象:
next(obj for obj in objs if obj.val==5)
Run Code Online (Sandbox Code Playgroud)
然而,这比完整列表理解更快.比较这两个:
[i for i in xrange(100000) if i == 1000][0]
next(i for i in xrange(100000) if i == 1000)
Run Code Online (Sandbox Code Playgroud)
第一个需要5.75ms,第二个需要58.3μs(因为环路短100倍,所以需要快100倍).