III OSA sisukord |
3.3 SÕNASTIK
Oleme tuttavad järjendite ja ennikutega, mille puhul igal elemendil on indeks. Nii on näiteks järjendi a = [2, 4, 7]
puhul elemendi 2 indeks 0, elemendi 4 indeks on 1 ja elemendi 7 indeks on 2. Elemente saab indeksite abil kätte: a[0]
, a[1]
ja a[2]
. Enniku puhul on indekseerimine samasugune - näiteks b = (2, 4, 7)
puhul b[0]
, b[1]
ja b[2]
.
Selline täisarvudega indekseerimine on väga kasulik, aga nii mõnelgi juhul oleks hea, kui elementide asukohta struktuuris ei määraks mitte järjekorranumber, vaid mingi muu väärtus. Näiteks võiksime tekitada struktuuri, kus "elementideks" (väärtusteks) on inimeste vanused ja "indeksiteks" (võtmeteks) nende inimeste nimed. Sel juhul saaksime näiteks vanused["Kersti"]
väärtuseks 46 ja vanused["Jüri"]
väärtuseks 38. Selline andmestruktuur on Pythonis täiesti olemas ja selle nimi on sõnastik.
Sõnastik (ingl dictionary) on dünaamilise (muutuva) pikkusega andmestruktuur, mille elemendid on tegelikult erilised paarid. Nende paaride esimest liiget nimetatakse võtmeks ja teist liiget väärtuseks. Koodis esitatakse sõnastik loogeliste sulgude {
ja }
vahel nii, et võti-väärtus paarid (kirjed) on komadega eraldatud. Paaride sees on võti ja väärtus eraldatud kooloniga.
>>> vanused = {"Kersti": 46, "Jüri": 38, "Jevgeni": 30, "Mart": 67} >>> vanused["Kersti"] 46 >>> vanused["Jüri"] 38
Võtmed ja väärtused võivad olla erinevat tüüpi. Nii ongi meil ka eelmises näites võtmed sõned ja väärtused täisarvud. Sõnastiku väärtused saavad olla mistahes tüüpi, kuid võtmed peavad tehnilistel põhjustel olema mittemuteerivat tüüpi. See tähendab, et võtmeteks sobivad näiteks arvud, sõned ja ennikud, aga ei sobi järjendid, hulgad ega teised sõnastikud.
Ülesanne
Kui tahame sõnastikku andmeid lisada, siis saame seda teha lihtsa omistamisega:
>>> vanused["Margus"] = 33 >>> vanused {'Jüri': 38, 'Mart': 67, 'Jevgeni': 30, 'Kersti': 46, 'Margus': 33}
Sõnastikus ei saa olla korduvaid võtmeid, korduvaid väärtusi saab küll olla. Kui püüda lisada uut väärtust võtmega, mis on juba sõnastikus olemas, siis eelnev väärtus kirjutatakse üle:
>>> vanused["Jevgeni"] 30 >>> vanused["Jevgeni"] = 31 >>> vanused["Jevgeni"] 31
Sõnastikku kasutataksegi niimoodi, et otsitakse võtme järgi väärtust. Vastupidi väärtuse järgi võtit kätte saada pole sõnastikust otseselt võimalik.
Ülesanne
Sõnastikus on võti-väärtus paarid järjestamata just nagu hulga puhulgi. Seega ei saa ka nendele paaridele kuidagi indeksite kaudu ligi.
Sõnastikuga saame tsükli abil opereerida mitut moodi. Sõnastike kirjetest saab for-tsükliga üle käia niimoodi:
vanused = {"Kersti": 46, "Jüri": 38, "Jevgeni": 30, "Mart": 67} for voti, vaartus in vanused.items(): print(voti, vaartus)
Siin vanused.items()
tagastab hulga tüüpi objekti, mis koosneb paaridest (ennikutest), kus esimesel kohal on võti ja teisel sellele vastav väärtus. Tsükli sama sammu ajal saame seega kasutada nii võtit kui vastavat väärtust.
Tihti kasutatakse for-tsüklit sõnastiku peal hoopis nii, et igal tsükli sammul saab tsüklimuutuja väärtuseks järjekordse võtme sõnastikust:
vanused = {"Kersti": 46, "Jüri": 38, "Jevgeni": 30, "Mart": 67} for voti in vanused: print(voti)
Kui viimast varianti kasutada, siis saaksime vastavale väärtusele ligi tavapäraselt: vanused[voti]
. See on täpselt analoogiline tsüklitele, mis töötasid järjendite indeksite peal.
Sõnastiku kirjete arvu saab sarnaselt eelnevatele struktuuridele kätte len
funktsiooni abil. Võtme sõnastikku kuuluvust saab kontrollida in
operaatoriga:
vanused = {"Kersti": 46, "Jüri": 38, "Jevgeni": 30, "Mart": 67} kolmikud = ("Sofia", "Maria", "Kersti") for nimi in kolmikud: if nimi not in vanused: vanused[nimi] = 13 print(vanused)
See programm lisas sõnastikku uusi kirjeid ainult juhul kui need olemasolevat väärtust üle ei kirjuta.
Sõnastikust saab kirjeid kustutada del
operaatori abil:
>>> vanused = {"Kersti": 46, "Jüri": 38, "Jevgeni": 30, "Mart": 67} >>> del vanused["Jüri"] >>> vanused {'Mart': 67, 'Jevgeni': 30, 'Kersti': 46}
III OSA sisukord |