Kā Python valodā iegūt saraksta ["foo", "bar", "baz"]
un saraksta elementa "bar"
indeksu (1)?
>>> ["foo", "bar", "baz"].index("bar")
1
Atsauce: Datu struktūras > Vairāk par sarakstiem
Ievērojiet, ka, lai gan šis, iespējams, ir tīrākais veids, kā atbildēt uz uzdoto jautājumu, index
ir diezgan vāja list
API sastāvdaļa, un es nevaru atcerēties, kad pēdējo reizi to izmantoju dusmās. Komentāros man tika norādīts, ka, tā kā uz šo atbildi ir daudz atsauču, tā būtu jāpapildina. Tālāk ir daži brīdinājumi par list.index
. Iespējams, ir vērts sākotnēji apskatīt tās dokumentāciju:
>>> print(list.index.__doc__)
L.index(value, [start, [stop]]) -> integer -- return first index of value.
Raises ValueError if the value is not present.
Izsaukums index
pārbauda katru saraksta elementu pēc kārtas, līdz atrod atbilstību. Ja saraksts ir garš un jūs nezināt, kurā saraksta vietā tas aptuveni atrodas, šī meklēšana var kļūt par šauru vietu. Tādā gadījumā jāapsver cita datu struktūra. Ņemiet vērā, ka, ja jūs aptuveni zināt, kur atrast atbilstību, jūs varat dot index
mājienu. Piemēram, šajā fragmentā l.index(999_999, 999_990, 1_000_000)
ir aptuveni par piecām kārtām ātrāks nekā vienkāršais l.index(999_999)
, jo pirmajā gadījumā ir jāpārmeklē tikai 10 ieraksti, bet otrajā - miljons:
>>> 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
Izsaukums index
meklē sarakstā secīgi, līdz atrod sakritību, un apstājas uz vietas. Ja jums ir vajadzīgi vairāku sakritību indeksi, jums jāizmanto saraksta izpratne vai ģeneratora izteiksme.
>>> [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
Lielākajā daļā vietu, kur es kādreiz izmantoju index
, tagad izmantoju saraksta izpratni vai ģeneratora izteiksmi, jo tās ir vispārīgākas. Tāpēc, ja apsverat iespēju ķerties pie index
, aplūkojiet šīs lieliskās Python funkcijas.
Izsaucot index
, rodas ValueError
, ja elementa sarakstā nav.
>>> [1, 1].index(2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: 2 is not in list
Ja elements var nebūt sarakstā, jums vajadzētu vai nu
item in my_list
(tīra, lasāma pieeja), vai arīindex
izsaukumu ietvert try/except
blokā, kas aiztur ValueError
(iespējams, tas ir ātrāk, vismaz tad, ja meklēmais saraksts ir garš un vienība parasti ir atrodama).Viena lieta, kas ir ļoti noderīga Python mācīšanās procesā, ir interaktīvās palīdzības funkcijas izmantošana:
>>> help(["foo", "bar", "baz"])
Help on list object:
class list(object)
...
|
| index(...)
| L.index(value, [start, [stop]]) -> integer -- return first index of value
|
kas bieži vien aizvedīs jūs līdz meklējamai metodei.
index()
atgriež vērtības pirmo indeksu!
| index(...) | L.index(value, [start, [stop]]) -> vesels skaitlis -- atgriež vērtības pirmo indeksu
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"])