Hurtigste måde at kontrollere, om en værdi findes i en liste

Hvad er den hurtigste måde at finde ud af, om en værdi findes i en liste (en liste med millioner af værdier) og hvad dens indeks er?

Jeg ved, at alle værdier i listen er unikke som i dette eksempel.

Den første metode, jeg prøver, er (3,8 sek. i min rigtige kode):

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

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

Den anden metode, jeg prøver, er (2x hurtigere: 1.9 sek. i min rigtige kode):

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

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

Foreslåede metoder fra Stack Overflow-bruger (2.74 sek. for min rigtige kode):

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

I min rigtige kode tager den første metode 3,81 sek. og den anden metode tager 1,88 sek. Det'er en god forbedring, men:

Jeg'er en nybegynder med Python/scripting, og er der en hurtigere måde at gøre de samme ting på og spare mere behandlingstid?

Mere specifik forklaring for min applikation:

I Blender API'et kan jeg få adgang til en liste over partikler:

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

Derfra kan jeg få adgang til en partikel's placering:

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

Og for hver partikel tester jeg, om der findes en nabo ved at søge på hver partikelplacering på følgende måde:

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])
Løsning
7 in a

Den klareste og hurtigste måde at gøre det på.

Du kan også overveje at bruge et set, men det kan tage mere tid at konstruere dette sæt ud fra din liste, end hurtigere medlemskabstest sparer dig for. Den eneste måde at være sikker på er ved at benchmarke godt. (dette afhænger også af hvilke operationer du har brug for)

Kommentarer (7)

Du kan sætte dine elementer ind i et set. Sætopslag er meget effektive.

Prøv:

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

redigering I en kommentar siger du, at du gerne vil have elementets indeks. Desværre har sæt ikke noget begreb om elementets position. Et alternativ er at præsortere din liste og derefter bruge binær søgning hver gang du skal finde et element.

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

Brug

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

Jeg tror, at dette er den hurtigste måde at vide, om en valgt værdi er i et array.

Kommentarer (5)