Miten saan luettelon ["foo", "bar", "baz"]
ja luettelon "bar"
kohdan indeksin (1) Pythonissa?
>>> ["foo", "bar", "baz"].index("bar")
1
Viite: Tietorakenteet > Lisää luetteloista
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.
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
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.
Kutsu index
:iin johtaa ValueError
:iin, jos elementti'ei ole läsnä.
>>> [1, 1].index(2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: 2 is not in list
Jos kohdetta ei välttämättä ole luettelossa, sinun on joko
item in my_list
(siisti, luettava lähestymistapa), tai sittenindex
-kutsu try/except
-lohkoon, joka ottaa kiinni ValueError
-virheen (luultavasti nopeampi, ainakin kun etsittävä lista on pitkä ja kohde on yleensä olemassa).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.
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"])