Encuentre el primer elemento de secuencia que coincida con un criterio [duplicado]
¿Cuál sería la forma más elegante y eficiente de encontrar/devolver el primer elemento de la lista que coincida con un determinado criterio?
Por ejemplo, si tengo una lista de objetos y me gustaría obtener el primer objeto de aquellos con atributo obj.val==5
. Por supuesto, podría usar la comprensión de listas, pero eso generaría O(n) y si n es grande, es un desperdicio. También podría usar un bucle break
una vez que se cumpliera el criterio, pero pensé que podría haber una solución más pitónica/elegante.
Si no tiene otros índices o información ordenada para sus objetos, tendrá que iterar hasta encontrar dicho objeto:
next(obj for obj in objs if obj.val == 5)
Sin embargo, esto es más rápido que comprender una lista completa. Compara estos dos:
[i for i in xrange(100000) if i == 1000][0]
next(i for i in xrange(100000) if i == 1000)
El primero necesita 5,75 ms, el segundo 58,3 µs (100 veces más rápido porque el bucle es 100 veces más corto).
Esto devolverá el objeto si lo encuentra; de lo contrario, devolverá"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))