sacar - Función de búsqueda de secuencia en Python
ordenamiento busqueda binaria python (4)
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 programa 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'')
¿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
Demasiado perezoso para escribir:
mylist = [10, 2, 20, 5, 50]
max(mylist, key=lambda x: x>10)
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 más 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 list-comprehension :
all_gt10 = [i for i in mylist if i > 10]