Indekseerimine (index)

Programmeerimiskeeltes tähendab indeks positsiooninumbrit, mis näitab elemendi asukohta erinevates andmestruktuurides. Kõik andmestruktuurid ei ole indekseeritavad, Pythonis saab positsiooninumbri väärtuse leida siis, kui tegemist on sõne, järjendi või ennikuga. Indeksitega toimetamine käib Pythonis kõigi indekseeritavata andmetüüpide puhul samamoodi.

Python on 0-indeksiga programmeerimiskeel. See tähendab, et andmestruktuuri esimene element asub indeksil 0.

Näiteks sõnes „PYTHON“ vastavad igale tähele järgmised indeksid:

../_images/indexing.png

Pythonis saab kasutada ka negatiivset indekseerimist andmestruktuuri elementidele ligipääsemiseks. Negatiivseid indekseid hakatakse loendama andmestruktuuri lõpust. Oluline on tähele panna, et andmestruktuuri algusest positsioonide lugemisel on esimene element indeksiga 0, kuid negatiivse indekseerimise korral on esimeseks -1. Kui viimane element oleks ka indeksiga 0, siis oleks ebaselge, kummalt poolt loendamist alustame.

Näiteks sõnes „PYTHON“ oleksid tähtedele vastavad negatiivsed indeksid järgmised:

../_images/negative-indexing.png

Indeksi leidmine elemendi järgi

Kui on teada, et element eksisteerib andmestruktuuris ja on vaja leida, mis on selle indeks, on Pythonis võimalik kasutada sisseehitatud meetodit index(), mis tagastab esimese (vasakpoolseima) indeksi, kus see element esineb. Juhul kui seda elementi esineb mitu korda, siis teisi indekseid seda meetodit kasutades leida ei saa.

Näiteks saame nii leida, et sõnes „banana“ esineb täht „b“ indeksil 0 ning täht „n“ esineb esimest korda indeksil 2:

print("banana".index("b")) # 0
print("banana".index("n")) # 2

Samuti saame index() meetodit kasutada järjendis - näiteks saame leida, et järjendis fruits esineb sõne „apple“ indeksil 0 ning sõne „banana“ indeksil 1:

fruits = ['apple', 'banana', 'cherry']
print(fruits.index('apple')) # 0
print(fruits.index('banana')) # 1

Kui index() meetodile ette antud elementi andmestruktuurist ei leita, tõstatab Python erindi ValueError.

Elemendile indeksi järgi ligipääsemine

Teades, millisel indeksil meid huvitav element andmestruktuuris asub, saame indeksi abil selle elemendi leida. Et soovitud element leida, pannakse selle indeks nurksulgudes otse meile huvipakkuva andmestruktuuri järgi.

Näiteks sõnes „apple“ asub täht „a“ indeksil 0 ja täht „e“ indeksil 4. Tähtede leidmiseks saab indekseid kasutada nii:

print("apple"[0]) # 'a'
print("apple"[4]) # 'e'

Samuti saab neile tähtedele ligipääsemiseks kasutada negatiivset indekseerimist:

print("apple"[-5]) # 'a'
print("apple"[-1]) # 'e'

Sarnaselt asub järjendis fruits sõne „apple“ indeksil 0 ja sõne „cherry“ indeksil 2 ning vajadusel saab ka järjendi puhul kasutada negatiivset indekseerimist.

fruits = ['apple', 'banana', 'cherry']
print(fruits[0]) # 'apple'
print(fruits[2]) # ´cherry`
print(fruits[-3]) # 'apple'
print(fruits[-1]) # 'cherry'

Indeksite abil saab ligi pääseda ka väärtustele iga andmestruktuuri alamstruktuurist.

nums = [[1, 2, 3], [4, 5, 6]]
print(nums[1][2]) # 6
fruits = ['apple', 'banana', 'cherry']
print(fruits[0][4]) # 'e'

Viilutamine kasutades indekseid (slicing)

Pythonis on võimalik indeksite abil andmestruktuuri „viilutada“, et sellest kiirelt sobiv alamhulk kätte saada. Viilutamine (slicing) kasutab süntaksit [start:stop:step], kus:

  • start on indeks, millest alustatakse tükeldamist (sellel indeksil olev element ise on kaasa arvatud);

  • stop on indeks, milleni viilutatakse (sellel indeksil olev element ise on välja arvatud);

  • step on täisarv, mis tähistab sammu suurust algusest, kui on vaja regulaarselt osa elemente vahele jätta.

Seda tehes võib vajadusel kasutada ka negatiivset indekseerimist.

Näiteks kui soovime sõnest „watermelon“ indekseid kasutades võtta välja iga teise tähe, alustades lugemist teisest tähest ja lõpetades eelviimasega, saaks seda teha nii:

print("watermelon"[1:-1:2]) #aeml

Samuti järjenditega - kui soovime järjendist fruits indekseid kasutades võtta välja iga kolmanda puuvilja, alustades lugemist teisest elemendist ning lõpetades eelviimasega, saaks seda teha nii:

fruits = [
"apple", "banana", "orange", "grape", "kiwi", "pear", "pineapple", "strawberry", "watermelon", "peach",
"mango", "cherry", "blueberry", "raspberry", "blackberry", "apricot", "plum", "lemon", "lime", "pomegranate"]
print(fruits[1:-1:3]) # ['banana', 'kiwi', 'strawberry', 'mango', 'raspberry', 'plum']

Kui jätta välja start, siis Python eeldab, et soovite alustada andmestruktuuri algusest:

language = 'Python'
print(language[:4]) # 'Pyth'

fruits = ['apple', 'banana', 'cherry']
print(fruits[:2]) # ['apple', 'banana']

Kui jätta välja stop, siis Python eeldab, et soovite valida kõik elemendid andmestruktuuri lõpuni:

language = 'Python'
print(language[1:]) # 'ython'

fruits = ['apple', 'banana', 'cherry']
print(fruits[1:]) # ['banana', 'cherry']

Kui jätta välja step, siis valitakse kõik elemendid vahemikus, mis start ja stop indeksitega täpsustatud on:

print("watermelon"[5:10]) # melon

fruits = ["apple", "banana", "orange", "grape", "kiwi", "pear", "pineapple",
"strawberry", "watermelon", "peach"]
print(fruits[3:8]) # ['grape', 'kiwi', 'pear', 'pineapple', 'strawberry']

Vaikimisi on step väärtuseks 1, -1 võimaldab andmestruktuuri itereerimist alustada selle lõpust. Kui step lisamata jätta, saab ka kooloni kirjapildist ära jätta (nagu ka just olnud näites), kuid kui jätta ära kas start või stop indeks, siis peab koolon kindlasti alles jääma.

Rohkem näiteid sõne viilutamist võid leida Pydoci peatükist Sõne viilutamine

Rohkem näiteid järjendi viilutamisest võid leida Pydoci peatükist Järjendi viilutamine kolme argumendiga