Cuando piense "verifique si a hay en b", piense en hashes (en este caso, conjuntos). La manera más rápida es revisar la lista que desea verificar y luego verificar cada elemento allí.
Esta es la razón por la que la respuesta de Joe Koberg es rápida: la comprobación de la intersección establecida es muy rápida.
Sin embargo, cuando no tienes muchos datos, hacer conjuntos puede ser una pérdida de tiempo. Por lo tanto, se puede hacer un conjunto de la lista y sólo comprobar cada elemento:
tocheck = [1,2] # items to check
a = [2,3,4] # the list
a = set(a) # convert to set (O(len(a)))
print [i for i in tocheck if i in a] # check items (O(len(tocheck)))
Cuando el número de elementos que desea comprobar es pequeño, la diferencia puede ser insignificante. Pero compruebe muchos números contra una lista grande ...
pruebas:
from timeit import timeit
methods = ['''tocheck = [1,2] # items to check
a = [2,3,4] # the list
a = set(a) # convert to set (O(n))
[i for i in tocheck if i in a] # check items (O(m))''',
'''L1 = [2,3,4]
L2 = [1,2]
[i for i in L1 if i in L2]''',
'''S1 = set([2,3,4])
S2 = set([1,2])
S1.intersection(S2)''',
'''a = [1,2]
b = [2,3,4]
any(x in a for x in b)''']
for method in methods:
print timeit(method, number=10000)
print
methods = ['''tocheck = range(200,300) # items to check
a = range(2, 10000) # the list
a = set(a) # convert to set (O(n))
[i for i in tocheck if i in a] # check items (O(m))''',
'''L1 = range(2, 10000)
L2 = range(200,300)
[i for i in L1 if i in L2]''',
'''S1 = set(range(2, 10000))
S2 = set(range(200,300))
S1.intersection(S2)''',
'''a = range(200,300)
b = range(2, 10000)
any(x in a for x in b)''']
for method in methods:
print timeit(method, number=1000)
velocidades:
M1: 0.0170331001282 # make one set
M2: 0.0164539813995 # list comprehension
M3: 0.0286040306091 # set intersection
M4: 0.0305438041687 # any
M1: 0.49850320816 # make one set
M2: 25.2735087872 # list comprehension
M3: 0.466138124466 # set intersection
M4: 0.668627977371 # any
El método que es rápido y consistente es hacer un juego (de la lista), pero la intersección trabaja en grandes conjuntos de datos el mejor!
Cosa graciosa, comprobé cómo se comportan 'y'. 'a = [1, 2] b = [3, 5, 2, 6, 8, 9] c = [3, 5, 6, 8, 1, 9] imprimir ( (1 y 2) en b , (2 y 1) en b , (1 y 2) en c , (2 y 1) en c, sep = '\ n') 'es Verdadero False False Verdadero –
[Puede consultar aquí, puede ayudarlo] (http://stackoverflow.com/questions/3389574/check-if-multiple-strings-exist-in-another-string/40880830#40880830) –