6 Sõnastikud

Pythoni sõnastikud on suvaliste objektide korrastamata kogumid, millel on juurdepääs võtmetele. Mõnikord nimetatakse neid ka assotsiatiivseteks massiivideks või hash-tabeliteks.


Konspteeritud ülevaade — Töötajate palkade haldamine sinu GitHubi koodi põhjal

https://github.com/AnastasiiaRadasheva/son.6.1/blob/master/module2.py

kood:

import random

def lae_sonad_failist():
    sonade_nimekiri = []
    try:
        with open("sonastik", "r", encoding="utf-8") as fail:
            for rida in fail:
                eesti, vene, inglise = rida.strip().split('-')
                sonade_nimekiri.append({'eesti': eesti, 'vene': vene, 'inglise': inglise})
    except:
        print("Faili ei leitud.")
    return sonade_nimekiri

def salvesta_sonad_faili(sonade_nimekiri):
    with open("sonastik", "w", encoding="utf-8") as fail:
        for sona in sonade_nimekiri:
            fail.write(f"{sona['eesti']}-{sona['vene']}-{sona['inglise']}\n")

def otsi_tolge(sonade_nimekiri, lahtekeel, sihtkeel, otsitav_sona):
    for sona in sonade_nimekiri:
        if sona[lahtekeel].lower() == otsitav_sona.lower():
            return sona[sihtkeel]
    return "Sõna ei leitud!"

def lisa_uus_sona(sonade_nimekiri):
    eesti_sona = input("Sisesta sõna eesti keeles: ").lower()
    vene_sona = input("Sisesta sõna vene keeles: ").lower()
    inglise_sona = input("Sisesta sõna inglise keeles: ").lower()

    sonade_nimekiri.append({'eesti': eesti_sona, 'vene': vene_sona, 'inglise': inglise_sona})
    salvesta_sonad_faili(sonade_nimekiri)
    print("Uus sõna lisatud!")

def vali_keel(kysimus):
    lubatud_keeled = ['eesti', 'vene', 'inglise']
    while True:
        keel = input(kysimus).lower()
        if keel in lubatud_keeled:
            return keel
        print(f"Viga: keel '{keel}' ei ole lubatud!")

def paranda_olemasolev_sona(sonade_nimekiri):
    lahtekeel = vali_keel("Sisesta keel, millest parandada sõna: ")
    vana_sona = input(f"Sisesta vana sõna ({lahtekeel}): ").lower()
    for sona in sonade_nimekiri:
        if sona[lahtekeel] == vana_sona:
            uus_sona = input(f"Sisesta uus sõna ({lahtekeel}): ").lower()
            sona[lahtekeel] = uus_sona
            salvesta_sonad_faili(sonade_nimekiri)
            print("Sõna parandatud!")
            return
    print("Sõna ei leitud!")

def kuva_koik_sonad(sonade_nimekiri):
    print("Sõnastikus olevad sõnad:")
    for sona in sonade_nimekiri:
        print(f"Eesti: {sona['eesti']}, Vene: {sona['vene']}, Inglise: {sona['inglise']}")
    print()

def vali_tolkesuund():
    lahtekeel = vali_keel("Vali lähtekeel: ")
    sihtkeel = vali_keel("Vali sihtkeel: ")
    return lahtekeel, sihtkeel

def testi_oma_teadmisi(sonade_nimekiri):
    punktid = 0
    kuvatavate_sonade_arv = 5
    lahtekeel, sihtkeel = vali_tolkesuund()
    print(f"Testi suund: {lahtekeel} -> {sihtkeel}")
    
    for _ in range(kuvatavate_sonade_arv):
        sona = random.choice(sonade_nimekiri)
        print(f"Tõlgi sõna ({lahtekeel}): {sona[lahtekeel]}")
        kasutaja_vastus = input("Sisesta tõlge: ").lower()
        if kasutaja_vastus == sona[sihtkeel]:
            punktid += 1
            print(f"Õige! Punktid: {punktid}")
        else:
            print(f"Vale! Õige vastus: {sona[sihtkeel]}")
    
    print(f"Testi tulemus: {punktid}/{kuvatavate_sonade_arv}")

def kysi_sisestus(kysimus):
    sisend = input(kysimus)
    if not sisend.strip():
        print("Sisestus ei tohi olla tühi!")
        return kysi_sisestus(kysimus)
    return sisend

def kuva_peamenyy():
    print("""
Menüü:
1. Otsi sõna
2. Lisa uus sõna
3. Paranda sõna
4. Kuva kõik sõnad
5. Testi teadmisi
6. Kustuta sõna
7. Välju
""")

def tervitus():
    print("Tere tulemast eestikeelsesse sõnastikku!")

def kustuta_sona(sonade_nimekiri):
    lahtekeel = vali_keel("Sisesta keel, millest sõna kustutada: ")
    kustutatav = input(f"Sisesta sõna ({lahtekeel}), mida soovid kustutada: ").lower()
    for sona in sonade_nimekiri:
        if sona[lahtekeel] == kustutatav:
            sonade_nimekiri.remove(sona)
            salvesta_sonad_faili(sonade_nimekiri)
            print("Sõna kustutatud!")
            return
    print("Sõna ei leitud!")

Loomulikult. Siin on eestikeelne versioon samast seletusest.


Mis on sõnastik (ehk dictionary) Pythonis?

Sõnastik on andmetüüp, mis võimaldab salvestada väärtusi koos nimetustega. Ehk siis mitte lihtsalt loetelu sõnadest, vaid igal sõnal on oma “silt” – näiteks, et see sõna on eesti keeles, see vene keeles ja see inglise keeles.

Näide:

{"eesti": "koer", "vene": "собака", "inglise": "dog"}

Siin:

  • "eesti" on võti ja "koer" on selle väärtus.
  • "vene" on võti, väärtuseks "собака".
  • "inglise" on võti, väärtuseks "dog".

Selline asi on üks sõnastik. Sinu programmis on terve loetelu sellistest sõnastikest – iga üks tähistab ühte sõna kolmes keeles.


Kus täpselt sinu koodis kasutatakse sõnastikke

1. Kui laed sõnu failist:

sonade_nimekiri.append({'eesti': eesti, 'vene': vene, 'inglise': inglise})

Sa loed faili realt ühe sõna kolmes keeles ja salvestad need ühte sõnastikku. Tulemus on näiteks selline:

[
    {'eesti': 'koer', 'vene': 'собака', 'inglise': 'dog'},
    {'eesti': 'kass', 'vene': 'кошка', 'inglise': 'cat'}
]

2. Kui otsid tõlget:

if sona[lahtekeel].lower() == otsitav_sona.lower():
    return sona[sihtkeel]

Sa vaatad iga sõnastiku sisse ja kontrollid, kas selles keeles (nt eesti keeles) on otsitav sõna olemas. Kui on – tagastad selle sõna teises keeles (nt inglise keeles).

See töötab just tänu sellele, et sa saad ligi minna väärtusele nime järgi (sona['vene']), mitte positsiooni järgi.

3. Kui lisad uue sõna:

sonade_nimekiri.append({'eesti': eesti_sona, 'vene': vene_sona, 'inglise': inglise_sona})

Siin teed jälle uue sõnastiku ja lisad selle nimekirja.

4. Kui parandad või kustutad sõna:

Otsid loendist sõnastiku, mille sees on vastav sõna (nt sona['eesti'] == "koer") ja kas muudavad selle väärtust või eemaldad kogu sõnastiku.


Miks üldse kasutada sõnastikku?

Kui sa hoiaksid sõnu näiteks lihtsalt listides:

["koer", "собака", "dog"]

Siis on keeruline aru saada, mis keeles miski on. Kui järjekord läheb sassi, on kõik segamini.

Sõnastik annab konkreetse struktuuri: sa alati tead, milline väärtus on mis keeles.


Kokkuvõte

Sõnastik Pythonis on viis, kuidas hoida seotud andmeid loogilisel kujul. Sinu programmis:

  • Iga sõna hoitakse kolmes keeles ühes tükis (ühte sõnastikus),
  • Neid on lihtne otsida, muuta ja kustutada,
  • Kogu süsteem püsib korras ja arusaadav.

Kui soovid, võin ka näidata, kuidas sama asi näeks välja ilma sõnastiketa – ja siis näeks, kui palju keerulisem see oleks.