Encuentre el primer elemento de secuencia que coincida con un criterio [duplicado]

Resuelto Jonathan Livni asked hace 12 años • 2 respuestas

¿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 breakuna vez que se cumpliera el criterio, pero pensé que podría haber una solución más pitónica/elegante.

Jonathan Livni avatar Mar 26 '12 15:03 Jonathan Livni
Aceptado

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

eumiro avatar Mar 26 '2012 08:03 eumiro

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))
Ashwini Chaudhary avatar Mar 26 '2012 09:03 Ashwini Chaudhary