2010-12-15 21 views

Respuesta

16

Tal

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

¿No sería mejor una tupla? – user225312

+0

@A A: El OP pidió verificar si un elemento está en una lista. Lo más probable es que esa lista no esté codificada en su código. –

3

Nota: Si usted puede poner los elementos como claves de un diccionario y luego evaluar a que es mucho más rápido gracias al algoritmo de 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.

+4

También podría usar un conjunto en este caso. –

+2

Usted * debería * usar un conjunto si no tiene uso para los valores dict. – FogleBird

0

Qué quiere 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) 

?

+0

Si esto realmente es lo que quiere el OP, sería mejor escribirlo como 'any (isinstance (x, int) para x en alist)', porque esto es más conciso y deja de iterar en el primer int encontrado. Pero no creo que esto sea lo que se pide. –

+0

tienes razón. he editado;) – Ant

2

Depende de lo que trates de hacer. Si la velocidad no importa, entonces usa a en lst. Si no importa, dependerá de si puede permitirse convertir primero su lista 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 nos fijamos por un artículo que está en el principio de la lista, utilizando un diccionario no acelerar 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 gran velocidad ordenando su secuencia y usando una búsqueda binaria (log (N) en lugar de N, log (N) siendo relativamente rápido comparado con O (1) para N 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.

+0

Aquí hay una versión más concisa de su código usando sets en lugar de dicts: https://gist.github.com/742056. Especialmente su llamada de constructor a 'timeit.Timer' parece un poco verbosa :) –

Cuestiones relacionadas