Il modo più veloce per controllare se un valore esiste in una lista

Qual è il modo più veloce per sapere se un valore esiste in una lista (una lista con milioni di valori) e qual è il suo indice?

So che tutti i valori della lista sono unici come in questo esempio.

Il primo metodo che provo è (3,8 sec nel mio codice reale):

a = [4,2,3,1,5,6]

if a.count(7) == 1:
    b=a.index(7)
    "Do something with variable b"

Il secondo metodo che provo è (2 volte più veloce: 1,9 sec per il mio codice reale):

a = [4,2,3,1,5,6]

try:
    b=a.index(7)
except ValueError:
    "Do nothing"
else:
    "Do something with variable b"

Metodi proposti dall'utente Stack Overflow (2,74 sec per il mio codice reale):

a = [4,2,3,1,5,6]
if 7 in a:
    a.index(7)

Nel mio codice reale, il primo metodo richiede 3,81 sec e il secondo metodo richiede 1,88 sec. È un buon miglioramento, ma:

Sono un principiante con Python/scripting, e c'è un modo più veloce per fare le stesse cose e risparmiare più tempo di elaborazione?

Spiegazione più specifica per la mia applicazione:

Nell'API di Blender posso accedere a una lista di particelle:

particles = [1, 2, 3, 4, etc.]

Da lì, posso accedere alla posizione di una particella:

particles[x].location = [x,y,z]

E per ogni particella verifico se esiste un vicino cercando la posizione di ogni particella in questo modo:

if [x+1,y,z] in particles.location
    "Find the identity of this neighbour particle in x:the particle's index
    in the array"
    particles.index([x+1,y,z])
Soluzione
7 in a

Il modo più chiaro e veloce per farlo.

Puoi anche considerare di usare un set, ma costruire quell'insieme dalla tua lista potrebbe richiedere più tempo di quanto il test di appartenenza più veloce risparmierebbe. L'unico modo per essere certi è fare un buon benchmark. (questo dipende anche da quali operazioni si richiedono)

Commentari (7)

Potresti mettere i tuoi elementi in un set. I set lookup sono molto efficienti.

Prova:

s = set(a)
if 7 in s:
  # do stuff

edit In un commento dici che ti piacerebbe ottenere l'indice dell'elemento. Sfortunatamente, gli insiemi non hanno alcuna nozione di posizione degli elementi. Un'alternativa è pre-ordinare la tua lista e poi usare la ricerca binaria ogni volta che hai bisogno di trovare un elemento.

Commentari (3)
def check_availability(element, collection: iter):
    return element in collection

Utilizzo

check_availability('a', [1,2,3,4,'a','b','c'])

Credo che questo sia il modo più veloce per sapere se un valore scelto è in un array.

Commentari (5)