Найти первый элемент последовательности, который соответствует критерию
Каков был бы самый элегантный и эффективный способ найти / вернуть первый элемент списка, который соответствует определенному критерию?
Например, если у меня есть список объектов, и я хотел бы получить первый объект из них с атрибутом obj.val==5
, Я мог бы, конечно, использовать понимание списка, но это повлекло бы за собой O(n), и если n большое, это расточительно. Я также мог бы использовать цикл с break
как только критерий был соблюден, но я подумал, что может быть более питонное / элегантное решение.
2 ответа
Если у вас нет других индексов или отсортированной информации для ваших объектов, вам придется выполнять итерацию до тех пор, пока такой объект не будет найден:
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 раз короче).
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))
он вернет объект, если найден, он вернет "не найден"