For en liste ["foo", "bar", "baz"]
og et element i listen `"bar", hvordan får jeg indeksen (1) i Python?
>>> ["foo", "bar", "baz"].index("bar")
1
Referanse: Datastrukturer > Mer om lister
Merk at selv om dette kanskje er den reneste måten å svare på spørsmålet som stilt, er index
en ganske svak komponent i list
API, og jeg kan ikke huske sist jeg brukte den i sinne. Det har blitt påpekt for meg i kommentarene at fordi dette svaret er sterkt referert, bør det gjøres mer fullstendig. Noen advarsler om list.index
følger. Det er sannsynligvis verdt å først ta en titt på dokumentstrengen for den:
>>> print(list.index.__doc__)
L.index(value, [start, [stop]]) -> integer -- return first index of value.
Raises ValueError if the value is not present.
Et index
-kall sjekker hvert element i listen i rekkefølge til det finner et treff. Hvis listen din er lang, og du ikke vet omtrent hvor i listen den forekommer, kan dette søket bli en flaskehals. I så fall bør du vurdere en annen datastruktur. Legg merke til at hvis du vet omtrent hvor du skal finne søket, kan du gi index
et hint. I dette utdraget er for eksempel l.index(999_999, 999_990, 1_000_000)
omtrent fem størrelsesordener raskere enn direkte l.index(999_999)
, fordi førstnevnte bare trenger å søke i 10 oppføringer, mens sistnevnte søker i en million:
>>> import timeit
>>> timeit.timeit('l.index(999_999)', setup='l = list(range(0, 1_000_000))', number=1000)
9.356267921015387
>>> timeit.timeit('l.index(999_999, 999_990, 1_000_000)', setup='l = list(range(0, 1_000_000))', number=1000)
0.0004404920036904514
Et kall til index
søker gjennom listen i rekkefølge til den finner et treff, og stopper der. Hvis du forventer å trenge indekser for flere treff, bør du bruke en listeforståelse eller et generatoruttrykk.
>>> [1, 1].index(1)
0
>>> [i for i, e in enumerate([1, 2, 1]) if e == 1]
[0, 2]
>>> g = (i for i, e in enumerate([1, 2, 1]) if e == 1)
>>> next(g)
0
>>> next(g)
2
De fleste steder der jeg en gang ville ha brukt index
, bruker jeg nå en listeforståelse eller generatoruttrykk fordi de er mer generaliserbare. Så hvis du vurderer å nå for index
, ta en titt på disse utmerkede python-funksjonene.
Et kall til index
resulterer i en ValueError
hvis elementet ikke er til stede.
>>> [1, 1].index(2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: 2 is not in list
Hvis elementet kanskje ikke er til stede i listen, bør du enten
item in my_list
(ren, lesbar tilnærming), ellerindex
-kallet inn i en try/except
-blokk som fanger opp ValueError
(sannsynligvis raskere, i hvert fall når listen som skal gjennomsøkes er lang, og elementet vanligvis finnes).En ting som er veldig nyttig for å lære Python, er å bruke den interaktive hjelpefunksjonen:
>>> help(["foo", "bar", "baz"])
Help on list object:
class list(object)
...
|
| index(...)
| L.index(value, [start, [stop]]) -> integer -- return first index of value
|
som ofte vil lede deg til metoden du leter etter.
index()
returnerer den første verdiindeksen!
| index(...) | L.index(verdi, [start, [stopp]]) -> heltall -- returnerer første indeks av verdi
def all_indices(value, qlist):
indices = []
idx = -1
while True:
try:
idx = qlist.index(value, idx+1)
indices.append(idx)
except ValueError:
break
return indices
all_indices("foo", ["foo","bar","baz","foo"])