10 Sõnastik
Oleme tuttavad järjenditega, mille puhul igal elemendil on indeks. Nii on näiteks järjendi
puhul elemendi 2 indeks 0, elemendi 4 indeks on 1 ja elemendi 7 indeks on 2. Elemendi väärtuse saab kätte indeksi järgi: a = [2, 4, 7]
a[0]
, a[1]
ja a[2]
.
Teatud olukordades oleks parem, et elemendi 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 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. Meie näites olid 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 mittemuteeritavat 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.
(Siinkohal võib lugeda hulkade lisamaterjali)
Enesekontroll (1 ülesanne)
Sõnastikule andmete lisamine
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 tohib 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.
Enesekontroll (1 ülesanne)
Sõnastiku läbimine
Sõnastikus on võti-väärtus paarid (kirjed) järjestamata. Seega ei saa nendele paaridele kuidagi indeksite kaudu ligi.
Sõnastiku läbimine for-tsükliga
Tihti kasutatakse for
-tsüklit sõnastiku peal 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)
Selle variandiga saame väärtusele ligi tavapäraselt: vanused[voti]
. See on täpselt analoogiline tsüklitele, mis töötasid järjendite indeksite peal.
Sõnastiku suurus
Sõnastiku kirjete arvu saab sarnaselt eelnevatele struktuuridele kätte
funktsiooni abil. Võtme sõnastikku kuuluvust saab kontrollida len
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 siis, kui need olemasolevat väärtust üle ei kirjuta.
Kirjete kustutamine sõnastikust
Sõnastikust saab kirjeid kustutada
operaatori abil:del
>>> vanused = {"Kersti": 46, "Jüri": 38, "Jevgeni": 30, "Mart": 67}
>>> del vanused["Jüri"]
>>> vanused
{'Mart': 67, 'Jevgeni': 30, 'Kersti': 46}
Sõnastik paaride hulgana
(Siinkohal võib lugeda hulkade lisamaterjali)
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 ka vastavat väärtust.