Quando si pensa "check per vedere se un in B", pensano gli hash (in questo caso, set). Il modo più veloce consiste nel cancellare l'elenco che si desidera controllare, quindi controllare ciascun elemento in esso.
Questo è il motivo per la risposta di Joe Koberg è veloce: il controllo impostare incrocio è molto veloce.
Quando non si dispone di un sacco di dati, però, rendendo set può essere una perdita di tempo. Quindi, è possibile effettuare una serie di lista e basta controllare ogni voce:
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)))
Quando il numero di elementi che si desidera controllare è piccolo, la differenza può essere trascurabile. Ma controlla un sacco di numeri contro una grande lista ...
prove:
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)
velocità:
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
Il metodo che è costantemente veloce è quello di rendere un insieme (della lista), ma l'incrocio lavora su grandi insiemi di dati il migliore!
La cosa divertente, ho controllato come 'e' si comporta. 'a = [1, 2] b = [3, 5, 2, 6, 8, 9] c = [3, 5, 6, 8, 1, 9] stampa ( (1 e 2) in b , (2 e 1) in b , (1 e 2) in c , (2 e 1) in C, settembre = '\ n') 'è vero Falso false True –
[Puoi controllare qui, potrebbe aiutarti] (http://stackoverflow.com/questions/3389574/check-if-multiple-strings-exist-in-another-string/40880830#40880830) –