找到/返回第一个匹配某个条件的列表项的最优雅和有效的方法是什么?
例如,如果我有一个对象列表,我想获得属性为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倍)。
如果找到,它会返回对象,否则返回"not found"
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))