tutorial soup find_next_sibling python if-statement

find_next_sibling - python soup find



Python, descubre que una lista no tiene un elemento especĂ­fico (4)

Digamos que hay una lista que contiene números y letras. ¿Existe una forma rápida de descubrir que la lista no contiene algún elemento específico? Planeo usarlo en condiciones.


Depende de lo que estés tratando de hacer. Si la velocidad no importa, entonces usa a en lst. Si es importante, dependerá de si puede permitirse convertir su lista primero a una estructura de datos diferente (es decir, a menudo buscará elementos en la lista decir), tamaño, etc.

Para dar una idea:

import timeit a = range(10000) da = dict(zip(a, [None for i in a])) def list_first(): return 0 in a def dict_first(): return 0 in da def list_last(): return 9999 in a def dict_last(): return 9999 in da if __name__ == "__main__": for f in ["list_first", "dict_first", "list_last", "dict_last"]: t = timeit.Timer("%s()" % f, setup="from __main__ import %s" % f) print min(t.repeat(number=10000))

Esto me da:

0.00302004814148 0.00318598747253 4.21943712234 0.004145860672

Si busca un artículo que está al principio de la lista, usar un dict no acelera las cosas, como se esperaba. Si busca un elemento al final, entonces la diferencia es muy significativa (3 orden de magnitud), aunque como se esperaba: dict use hashtable, listas necesita buscar cada elemento uno después del otro.

Si los elementos son comparables, también puede obtener una velocidad significativa ordenando su secuencia y usando una búsqueda binaria (log (N) en lugar de N, log (N) siendo relativamente rápido comparando O (1) para N no demasiado grande en la práctica para Python), o usando estructuras más avanzadas (árbol de búsqueda binaria, etc.). Puede ser bastante complejo: las estructuras de datos para la búsqueda rápida son, después de todo, uno de los problemas más estudiados en CS.


Nota: Si puede poner los elementos como claves de un dict, probar la membresía es mucho más rápido gracias al algoritmo hash. Solo será un problema si su lista es muy larga o si su aplicación hace mucho de este tipo de cosas. De lo contrario, "X no en Y", como dice Sven.


Quieres decir

bool([x for x in alist if isinstance(x, int)])

mejor versión (por Sven Marnach):

any(isinstance(x, int) for x in alist)

?


Tal vez

3 not in [1, 2, "a"] # True