Arvutiteaduse instituut
  1. Kursused
  2. 2017/18 kevad
  3. Programmeerimise alused II (LTAT.TK.001)
EN
Logi sisse

Programmeerimise alused II 2017/18 kevad

  • Kursuse info
  • 1. Kahemõõtmeline järjend
  • 2. Kahekordne tsükkel
  • 3. Andmestruktuurid

3.1 Järjend ja ennik 3.2 Hulk 3.3 Sõnastik 3.4 Andmestruktuuride võrdlus 3.5 Sõne 3.6 Silmaring: Andmebaasid

  • 4. Viitamine ja muteerimine
  • 5. Testimine ja silumine. Rekursioon
  • 6. Rekursioon II
  • Korraldajad
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.


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}

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.


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
  • Arvutiteaduse instituut
  • Loodus- ja täppisteaduste valdkond
  • Tartu Ülikool
Tehniliste probleemide või küsimuste korral kirjuta:

Kursuse sisu ja korralduslike küsimustega pöörduge kursuse korraldajate poole.
Õppematerjalide varalised autoriõigused kuuluvad Tartu Ülikoolile. Õppematerjalide kasutamine on lubatud autoriõiguse seaduses ettenähtud teose vaba kasutamise eesmärkidel ja tingimustel. Õppematerjalide kasutamisel on kasutaja kohustatud viitama õppematerjalide autorile.
Õppematerjalide kasutamine muudel eesmärkidel on lubatud ainult Tartu Ülikooli eelneval kirjalikul nõusolekul.
Tartu Ülikooli arvutiteaduse instituudi kursuste läbiviimist toetavad järgmised programmid:
euroopa sotsiaalfondi logo