找到与标准匹配的第一个序列项

时间:2012-03-26 08:11:33

标签: python list

查找/返回符合特定条件的第一个列表项最优雅有效的方法是什么?

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

2 个答案:

答案 0 :(得分:464)

如果您的对象没有任何其他索引或已排序信息,则必须迭代直到找到这样的对象:

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

答案 1 :(得分:3)

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

如果发现它将返回该对象,否则它将返回“未找到”