找到/返回符合特定标准的第一个列表项的最优雅、最有效的方法是什么?
例如,如果我有一个对象列表,我想得到属性为obj.val==5
的对象中的第一个对象.我当然可以使用列表理解,但这会导致O(n),如果n很大,这是浪费.一旦满足标准,我也可以使用break
循环,但我认为可能会有一个更符合python/优雅的解决方案.
找到/返回符合特定标准的第一个列表项的最优雅、最有效的方法是什么?
例如,如果我有一个对象列表,我想得到属性为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倍).