Función de búsqueda de secuencia en Python

¿Cómo encuentro un objeto en una secuencia que satisface un criterio particular?

Lista de comprensión y filtro que recorre toda la lista. ¿Es la única alternativa un lazo hecho a mano?

mylist = [10, 2, 20, 5, 50] find(mylist, lambda x:x>10) # Returns 20 

Aquí está el patrón que uso:

 mylist = [10, 2, 20, 5, 50] found = next(i for i in mylist if predicate(i)) 

O, en Python 2.4 / 2.5, next() no es una incorporada:

 found = (i for i in mylist if predicate(i)).next() 

Tenga en cuenta que next() genera StopIteration si no se encontró ningún elemento. En la mayoría de los casos, eso es probablemente bueno. Usted solicitó el primer elemento, no existe tal elemento y, por lo tanto, es probable que el progtwig no pueda continuar.

Si, por otro lado, sabe qué hacer en ese caso, puede proporcionar un valor predeterminado a next():

 conf_files = ['~/.foorc', '/etc/foorc'] conf_file = next((f for f in conf_files if os.path.exists(f)), '/usr/lib/share/foo.defaults') 

En realidad, en Python 3, al menos, el filtro no pasa por toda la lista.

Para volver a comprobar:

 def test_it(x): print(x) return x>10 var = next(filter(test_it, range(20))) 

En Python 3.2, eso imprime 0-11, y asigna var a 11.

En las versiones 2.x de Python puede que necesite usar itertools.ifilter.

Si solo quieres los primeros mayores de 10 puedes usar itertools.ifilter :

 import itertools first_gt10 = itertools.ifilter(lambda x: x>10, [10, 2, 20, 5, 50]).next() 

Si desea que todos sean mayores que 10, puede ser más simple usar una comprensión de lista :

 all_gt10 = [i for i in mylist if i > 10] 

Demasiado perezoso para escribir:

 mylist = [10, 2, 20, 5, 50] max(mylist, key=lambda x: x>10)