查找/返回与某个标准匹配的第一个列表项的最优雅和最有效的方法是什么?
例如,如果我有一个对象列表,并且我想获取具有属性的对象的第一个对象obj.val==5。我当然可以使用列表推导,但这会产生 O(n) 并且如果 n 很大,那就是浪费。一旦满足标准,我也可以使用循环break,但我认为可能会有更 Pythonic/优雅的解决方案。
obj.val==5
break
如果您的对象没有任何其他索引或排序信息,那么您将不得不迭代直到找到这样的对象:
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 倍)。