Найдите элемент первой последовательности, соответствующий критерию

Каким будет самый элегантный и эффективный способ поиска/возврата первого элемента списка, который соответствует определенному критерию?

Например, если у меня есть список объектов, и я хотел бы получить первый объект с атрибутом obj.val==5. Я мог бы, конечно, использовать понимание списков, но это повлечет за собой O (n), а если n велико, то это расточительно. Я мог бы также использовать цикл с break после выполнения критерия, но я думал, что может быть больше pythonic/элегантное решение.

Ответ 1

Если у вас нет каких-либо других индексов или отсортированной информации для ваших объектов, вам придется выполнять итерацию до тех пор, пока не будет найден такой объект:

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,75 мс, второй - 58,3 мкс (в 100 раз быстрее, потому что цикл в 100 раз короче).

Ответ 2

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

он вернет объект, если обнаружит, что он вернет "не найден"