Найдите элемент первой последовательности, соответствующий критерию
Каким будет самый элегантный и эффективный способ поиска/возврата первого элемента списка, который соответствует определенному критерию?
Например, если у меня есть список объектов, и я хотел бы получить первый объект с атрибутом 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))
он вернет объект, если обнаружит, что он вернет "не найден"