Kohteen indeksin etsiminen sen sisältävän listan perusteella Pythonissa

Miten saan luettelon ["foo", "bar", "baz"] ja luettelon "bar" kohdan indeksin (1) Pythonissa?

Ratkaisu
>>> ["foo", "bar", "baz"].index("bar")
1

Viite: Tietorakenteet > Lisää luetteloista

Varoituksia seuraa

Huomaa, että vaikka tämä on ehkä siistein tapa vastata kysymykseen siten kuin se on esitetty, index on melko heikko osa list API:ta, enkä muista, milloin olisin viimeksi käyttänyt sitä vihaisena. Minulle on huomautettu kommenteissa, että koska tähän vastaukseen viitataan paljon, siitä pitäisi tehdä täydellisempi. Seuraavassa on joitakin varoituksia list.indexistä. Kannattaa luultavasti aluksi vilkaista sen docstringiä:

>>> print(list.index.__doc__)
L.index(value, [start, [stop]]) -> integer -- return first index of value.
Raises ValueError if the value is not present.

Lineaarinen aikakompleksisuus listan pituuden suhteen.

index-kutsu tarkistaa listan jokaisen elementin järjestyksessä, kunnes se löytää vastaavuuden. Jos listasi on pitkä, etkä tiedä, missä kohtaa listaa se esiintyy, tämä haku voi muodostua pullonkaulaksi. Siinä tapauksessa sinun kannattaa harkita toisenlaista tietorakennetta. Huomaa, että jos tiedät suurin piirtein, mistä osuma löytyy, voit antaa index:lle vihjeen. Esimerkiksi tässä pätkässä l.index(999_999, 999_990, 1_000_000) on noin viisi kertaluokkaa nopeampi kuin suora l.index(999_999), koska ensin mainitun on etsittävä vain 10 merkintää, kun taas jälkimmäisen on etsittävä miljoona:

>>> 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

Palauttaa vain ensimmäisen vastaavuuden indeksin argumenttiinsa.

Kutsu index hakee listaa järjestyksessä, kunnes se löytää osuman, ja pysähtyy siihen. Jos odotat tarvitsevasi useampien osumien indeksejä, sinun pitäisi käyttää listan ymmärtämistä tai generaattorilauseketta.

>>> [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

Useimmissa paikoissa, joissa olisin ennen käyttänyt index, käytän nyt listan ymmärtämistä tai generaattorilauseketta, koska ne ovat yleistettävämpiä. Jos siis harkitset index:n käyttämistä, tutustu näihin erinomaisiin python-ominaisuuksiin.

Heittää, jos elementtiä ei ole listassa.

Kutsu index:iin johtaa ValueError:iin, jos elementti'ei ole läsnä.

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

Jos kohdetta ei välttämättä ole luettelossa, sinun on joko

  1. Tarkista se ensin komennolla item in my_list (siisti, luettava lähestymistapa), tai sitten
  2. Kääri index-kutsu try/except-lohkoon, joka ottaa kiinni ValueError-virheen (luultavasti nopeampi, ainakin kun etsittävä lista on pitkä ja kohde on yleensä olemassa).
Kommentit (2)

Yksi asia, joka on todella hyödyllinen Pythonin oppimisessa, on interaktiivisen aputoiminnon käyttäminen:

>>> help(["foo", "bar", "baz"])
Help on list object:

class list(object)
 ...

 |
 |  index(...)
 |      L.index(value, [start, [stop]]) -> integer -- return first index of value
 |

joka usein johtaa sinut etsimäsi menetelmän pariin.

Kommentit (1)

index() palauttaa arvon ensimmäisen indeksin!

| index(...) | L.index(value, [start, [stop]]) -> kokonaisluku -- palauttaa arvon ensimmäisen indeksin.

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