Mikä on nopein tapa tietää, onko arvo olemassa listassa (listassa, jossa on miljoonia arvoja) ja mikä on sen indeksi?
Tiedän, että kaikki luettelon arvot ovat ainutlaatuisia, kuten tässä esimerkissä.
Ensimmäinen kokeilemani menetelmä on (3,8 sekuntia oikeassa koodissani):
a = [4,2,3,1,5,6]
if a.count(7) == 1:
b=a.index(7)
"Do something with variable b"
Toinen kokeilemani menetelmä on (2x nopeampi: 1.9 sekuntia todellisessa koodissani):
a = [4,2,3,1,5,6]
try:
b=a.index(7)
except ValueError:
"Do nothing"
else:
"Do something with variable b"
Stack Overflow -käyttäjän ehdottamat menetelmät (2.74 sekuntia todelliseen koodiini):
a = [4,2,3,1,5,6]
if 7 in a:
a.index(7)
Todellisessa koodissani ensimmäinen menetelmä kestää 3,81 sekuntia ja toinen menetelmä 1,88 sekuntia. Se'on hyvä parannus, mutta:
Onko olemassa nopeampi tapa tehdä samat asiat ja säästää enemmän käsittelyaikaa?
Kohtaisempi selitys sovelluksestani:
Blenderin API:ssa voin käyttää hiukkasluetteloa:
particles = [1, 2, 3, 4, etc.]
Sieltä pääsen käsiksi hiukkasen sijaintiin:
particles[x].location = [x,y,z]
Ja jokaisen hiukkasen kohdalla testaan, onko naapuria olemassa etsimällä jokaisen hiukkasen sijaintia seuraavasti:
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])
7 in a
Selkein ja nopein tapa tehdä se.
Voit myös harkita set
-joukon käyttämistä, mutta joukon rakentaminen listasta voi viedä enemmän aikaa kuin nopeampi jäsenyystestaus säästää. Ainoa tapa saada varmuus on suorittaa hyvä vertailu. (tämä riippuu myös siitä, mitä operaatioita tarvitset).
Voit laittaa kohteet set
. Joukkojen haku on erittäin tehokasta.
Kokeile:
s = set(a)
if 7 in s:
# do stuff
edit Kommentissa sanot, että haluaisit saada elementin indeksin. Valitettavasti joukoilla ei ole käsitystä elementin sijainnista. Vaihtoehtona on lajitella lista valmiiksi ja käyttää sitten binäärihakua aina, kun haluat löytää elementin.
def check_availability(element, collection: iter):
return element in collection
Käyttö
check_availability('a', [1,2,3,4,'a','b','c'])
Uskon, että tämä on nopein tapa tietää, onko valittu arvo joukossa.