Finne indeksen til et element gitt en liste som inneholder det i Python

For en liste ["foo", "bar", "baz"] og et element i listen `"bar", hvordan får jeg indeksen (1) i Python?

Løsning
>>> ["foo", "bar", "baz"].index("bar")
1

Referanse: Datastrukturer > Mer om lister

Forbehold følger

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.

Lineær tidskompleksitet i listelengde

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

Returnerer bare indeksen for første treff til argumentet.

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.

Kaster hvis elementet ikke er til stede i listen

Et kall til index resulterer i en ValueError hvis elementet ikke er til stede.

>>> [1, 1].index(2)
Traceback (most recent call last):
  File "", line 1, in 
ValueError: 2 is not in list

Hvis elementet kanskje ikke er til stede i listen, bør du enten

  1. Se etter det først med item in my_list (ren, lesbar tilnærming), eller
  2. Pakk index-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).
Kommentarer (2)

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.

Kommentarer (1)

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"])
Kommentarer (3)