Najhitrejši način preverjanja, ali vrednost obstaja na seznamu

Kako najhitreje ugotoviti, ali vrednost obstaja na seznamu (seznamu z milijoni vrednosti) in kakšen je njen indeks?

Vem, da so vse vrednosti na seznamu edinstvene, kot v tem primeru.

Prva metoda, ki sem jo poskusil, je (3,8 sekunde v moji pravi kodi):

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

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

Druga metoda, ki sem jo poskusil, je (2x hitrejša: 1,9 sekunde v moji pravi kodi):

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

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

Predlagane metode uporabnika Stack Overflow (2,74 sekunde za mojo pravo kodo):

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

V moji pravi kodi prva metoda traja 3,81 s, druga metoda pa 1,88 s. To je dober napredek, vendar:

Ali obstaja hitrejši način za opravljanje istih stvari in prihranek časa obdelave?

Konkretnejša razlaga za mojo aplikacijo:

V API Blenderja lahko dostopam do seznama delcev:

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

Od tam lahko dostopam do lokacije delca:

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

Za vsak delec preverim, ali obstaja sosed, tako da poiščem lokacijo vsakega delca na naslednji način:

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])
Rešitev
7 in a

Najbolj jasen in hiter način.

Razmislite lahko tudi o uporabi seta, vendar lahko konstruiranje tega seta iz seznama vzame več časa, kot ga bo prihranilo hitrejše testiranje članstva. Edini način, da se prepričate, je dobro primerjanje. (to je odvisno tudi od tega, katere operacije potrebujete).

Komentarji (7)

Predmete lahko shranite v set. Iskanje množic je zelo učinkovito.

Poskusite:

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

edit V komentarju pravite, da bi radi dobili indeks elementa. Na žalost se pri množicah ne pozna položaj elementa. Druga možnost je, da seznam predhodno razvrstite in nato uporabite binarno iskanje vsakič, ko morate najti element.

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

Uporaba

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

Menim, da je to najhitrejši način za ugotavljanje, ali je izbrana vrednost v polju.

Komentarji (5)