Python Vadovėlis/Žodynai

Iš wiki.angis.net.
Jump to navigation Jump to search
 ← Loginiai reiškiniai Turinys Modulių naudojimas → 

Šis skyrius yra apie žodynus. Žodynai turi raktus ir reikšmes. Raktai naudojami reikšmėms rasti. Štai žodyno pavyzdys:

def spausdink_meniu():
    print('1. Spausdink telefonų numerius')
    print('2. Pridėk telefono numerį')
    print('3. Pašalink telefono numerį')
    print('4. Ieškok telefono numerio')
    print('5. Išeik')
    print()

numeriai = {}
meniu_pasirinkimas = 0
spausdink_meniu ()
while meniu_pasirinkimas != 5:
    meniu_pasirinkimas = int(input("Įvesk skaičių (1-5): "))
    if meniu_pasirinkimas == 1:
        print("Telefono numeriai: ")
        for x in numeriai.keys():
            print("Vardas: ", x, "\tTelefono numeris:", numeriai[x])
        print()
    elif meniu_pasirinkimas == 2:
        print("Pridėk vardą ir telefono numerį")
        vardas = input("Vardas: ")
        numeris = input("Telefono numeris: ")
        numeriai[vardas] = numeris 
    elif meniu_pasirinkimas == 3:
        print("Pašalink vardą ir telefono numerį")
        vardas = input("Vardas: ")
        if vardas in numeriai:
            del numeriai[vardas]
        else:
            print(vardas, " nebuvo rastas")
    elif meniu_pasirinkimas == 4:
        print("Ieškok telefono numerio")
        vardas = input("Vardas: ")
        if vardas in numeriai:
            print("Telefono numeris yra ", numeriai[vardas])
        else:
            print(vardas, " nebuvo rastas")
    elif meniu_pasirinkimas  != 5:
        print_menu()

O čia - mano išvestis:

1. Spausdink telefonų numerius
2. Pridėk telefono numerį
3. Pašalink telefono numerį
4. Ieškok telefono numerio
5. Išeik

Įvesk skaičių (1-5): 2
Pridėk vardą ir telefono numerį
Vardas: Benas
Telefono numeris: 869935951
Įvesk skaičių (1-5): 2
Pridėk vardą ir telefono numerį
Vardas: Liepa
Telefono numeris: 869935952
Įvesk skaičių (1-5): 2
Pridėk vardą ir telefono numerį
Vardas: Markas
Telefono numeris: 869935957
Įvesk skaičių (1-5): 1
Telefono numeriai:
Vardas: Benas         Telefono numeris: 869935951
Vardas: Liepa         Telefono numeris: 869935952
Vardas: Markas        Telefono numeris: 869935957

Įvesk skaičių (1-5): 4
Ieškok telefono numerio
Vardas: Benas
Telefono numeris yra 869935951
Įvesk skaičių (1-5): 3
Pašalink telefono numerį
Vardas: Markas
Įvesk skaičių (1-5): 1
Telefono numeriai:
Vardas: Liepa      Telefono numeris: 869935952
Vardas: Benas      Telefono numeris: 869935951

Įvesk skaičių (1-5): 5

Ši programa yra panaši į programą su vardų sąrašu, pateiktu prieš tai buvusiame skyriuje apie sąrašus. Štai kaip veikia programa. Pirmiausiai yra aprašoma funkcija spausdink_meniu. spausdink_meniu tiesiog spausdina meniu, kuris vėliau du kartus naudojamas programoje. Po to, pateikiama keistai atrodanti eilutė numeriai = {}. Ši eilutė Python'ui pasako, kad numeriai yra žodynas. Kitos kelios eilutės tiesiog padaro taip, kad meniu veiktų. Vykdydant ciklą:

for x in numeriai.keys():
    print("Vardas: ", x, "\tTelefono numeris:", numeriai[x])

einama per žodyną ir spausdinami žodyne esantys elementai. Funkcija numeriai.keys() grąžina žodyno elementų raktų sąrašą, kuris yra vėliau naudojamas for cikle. Sąrašas grąžinamas keys() metodo pagalba neturi jokio eiliškumo, todėl, jei tu nori, kad jis būtų abėcėlės tvarka, jis turi būti surūšiuotas. Taigi, šiuo atveju x yra tekstinė eilutė – vardai. Panašiai kaip sąrašai, komanda numeriai[x] naudojama norint pasiekti konkretų žodyno elementą. Šiuo atveju tai yra telefonų numeriai. Komanda print visa tai atspausdina.

print("Pridėk vardą ir telefono numerį")
vardas = input("Vardas: ")
numeris = input("Telefono numeris: ")
numeriai[vardas] = numeris

Padarius kitą pasirinkimą, pirmiausiai paklausiamas vardas – tai bus žodyno elemento raktas, ir paklausiamas numeris. Toliau, komanda numeriai[vardas] = telefonas prideda vardą ir telefono numerį į žodyną. Jei vardas jau būtų buvęs žodyne, telefonas pakeistų prieš tai buvusią reikšmę. Toliau sąlyginis sakinys

if vardas in numeriai:
    del numeriai[vardas]

tikrina, ar vardas yra žodyne, ir jei yra, jį pašalina. Komanda vardas in numeriai grąžina loginę reikšmę True, jei vardas yra numeriai žodyne, bet kitu atveju grąžina False. Komanda del numeriai[vardas] pašalina raktą vardas ir su tuo raktu susietą reikšmę. Sąlyginis sakinys

if vardas in numeriai:
    print("Telefono numeris yra ", numeriai[vardas])

patikrina, ar žodynas turi tam tikrą raktą ir jei žodynas turi tą raktą, išspausdina su juo susietą numerį. Galiausiai, jei meniu pasirinkimas negalioja, pagrindinis meniu yra atspausdinamas, kad tu galėtum juo pasigrožėti.

Apibendrinimas: žodynai turi raktus ir reikšmes. Raktu gali būti tekstinė eilutė arba skaičius. Raktai nurodo reikšmes. Reikšmės gali būti bet kokio tipo kintamieji (įskaitant sąrašus ar net žodynus (žinoma, tuose žodynuose ar sąrašuose gali būti patys žodynai ar sąrašai (baisu, ane? :-) ))). Štai yra pavyzdys, kai naudojamas sąrašas žodyne:

max_taškai = [25, 25, 50, 25, 100]
užduotys = ['nd sk 1', 'nd sk 2', 'viktorina   ', 'nd sk 3', 'testas']
mokiniai = {'#Max': max_taškai}

def spausdink_meniu():
    print("1. Pridėk mokinį")
    print("2. Pašalink mokinį")
    print("3. Spausdink pažymius")
    print("4. Įrašyk pažymį")
    print("5. Spausdink meniu")
    print("6. Išeik")

def spausdink_visus_pažymius():
    print('\t', end=' ')
    for i in range(len(užduotys)):
        print(užduotys[i], '\t', end=' ')
    print()
    raktai = list(mokiniai.keys())
    raktai.sort()
    for x in raktai:
        print(x, '\t', end=' ')
        pažymiai = mokiniai[x]
        spausdink_pažymius(pažymiai)

def spausdink_pažymius(pažymiai):
    for i in range(len(pažymiai)):
        print(pažymiai[i], '\t', end=' ')
    print()

spausdink_meniu()
meniu_pasirinkimas = 0
while meniu_pasirinkimas != 6:
    print()
    meniu_pasirinkimas = int(input("Meniu pasirinkimas (1-6): "))
    if meniu_pasirinkimas == 1:
        vardas = input("Pridėk mokinį: ")
        mokiniai[vardas] = [0] * len(max_taškai)
    elif meniu_pasirinkimas == 2:
        vardas = input("Pašalink mokinį: ")
        if vardas in mokiniai:
            del mokiniai[vardas]
        else:
            print("Vardas: ", vardas, " nebuvo rastas")
    elif meniu_pasirinkimas == 3:
        spausdink_visus_pažymius()
    elif meniu_pasirinkimas == 4:
        print("Įrašyk pažymį")
        vardas = input("Mokinys: ")
        if vardas in mokiniai:
            pažymiai = mokiniai[vardas]
            print("Įrašyk mokinio pažymį")
            print("Įrašyk 0 (nulį), kad išeitum")
            for i in range(len(užduotys)):
                print(i + 1, užduotys[i], '\t', end=' ')
            print()
            spausdink_pažymius(pažymiai)
            kuris = 1234
            while kuris != -1:
                kuris = int(input("Pakeisk kuris pažymį: "))
                kuris -= 1    #tas pats kaip ir: kuris = kuris - 1
                if 0 <= kuris < len(pažymiai):
                    pažymys = int(input("Pažymys: "))
                    pažymiai[kuris] = pažymys
                elif kuris != -1:
                    print("Klaidingas pažymys")
        else:
            print("Mokinys nerastas")
    elif meniu_pasirinkimas != 6:
        spausdink_meniu()

O štai čia yra išvestis:

1. Pridėk mokinį
2. Pašalink mokinį
3. Spausdink pažymius
4. Įrašyk pažymį
5. Spausdink meniu
6. Išeik

Meniu pasirinkimas (1-6): 3
       nd sk 1         nd sk 2       viktorina       nd sk 3            testas 
#Max    25              25              50              25              100 

Meniu pasirinkimas (1-6): 5
1. Pridėk mokinį
2. Pašalink mokinį
3. Spausdink pažymius
4. Įrašyk pažymį
5. Spausdink meniu
6. Išeik

Meniu pasirinkimas (1-6): 1
Pridėk mokinį: Markas

Meniu pasirinkimas (1-6): 4
Įrašyk pažymį
Mokinys: Markas
Įrašyk mokinio pažymį
Įrašyk 0 (nulį), kad išeitum
1   nd sk 1     2   nd sk 2     3   viktorina        4   nd sk 3     5   testas 
0               0               0               0               0 
Pakeisk kuris pažymį: 1
Pažymys: 25
Pakeisk kuris pažymį: 2
Pažymys: 24
Pakeisk kuris pažymį: 3
Pažymys: 45
Pakeisk kuris pažymį: 4
Pažymys: 23
Pakeisk kuris pažymį: 5
Pažymys: 95
Pakeisk kuris pažymį: 0

Meniu pasirinkimas (1-6): 3
          nd sk 1         nd sk 2         viktorina       nd sk 3          testas
#Max        25              25              50              25              100
Markas      25              24              45              23              95 

Meniu pasirinkimas (1-6): 6

Štai kaip veikia programa. Iš esmės, kintamasis mokiniai yra žodynas, kurio raktai yra mokinių vardai, o reikšmės – jų pažymiai. Pirmosios dvi eilutės tik sukuria du sąrašus. Kita eilutė mokiniai = {'#Max': max_taškai} sukuria naują žodyną su raktu {#Max}, o reikšmė yra [25, 25, 50, 25, 100] (pirmame sakinyje max_taškai buvo padarytas priskyrimas) (aš naudoju raktą #Max, nes rūšiuojant simolis # patenka prieš bet kokias abėcėlės raides). Toliau aprašoma funkcija spausdink_meniu. Kaip jau žinai, ji spausdina meniu. Po to aprašoma funkcija spausdink_visus_pažymius:

def spausdink_visus_pažymius():
    print('\t',end=" ")
    for i in range(len(užduotys)):
        print(užduotys[i], '\t',end=" ")
    print()
    raktai = list(mokiniai.keys())
    keys.sort()
    for x in raktai:
        print(x, '\t',end=' ')
        pažymiai = mokiniai[x]
        spausdink_pažymius(pažymiai)

Atkreipk dėmesį, į tai, kaip žodyno mokiniai raktai yra išimami į kintamąjį raktai su komanda raktai = list(mokiniai.keys()). Kintamasis raktai turės būti rūšiuojamas, todėl yra paverčiamas į sąrašą. Taip bus galima naudoti visas sąrašų funkcijas. Toliau raktai yra surūšiuojami eilutėje raktai.sort(). for yra naudojamas pereiti per visus raktus. Pažymiai yra saugomi kaip sąrašas žodyno viduje, todėl priskyrimas pažymiai = mokiniai[x] duoda pažymiai sąrašą, kuris yra saugomas su x raktu. Funkcija spausdink_pažymius tiesiog spausdina sąrašą ir yra aprašyta keliomis eilutėmis žemiau.

Tolimesnės programos eilutės įgyvendina įvairius meniu pasirinkimus. Eilutė mokiniai[vardas] = [0] * len(max_taškai) prideda mokinį į žodyną: vardas yra naujas raktas. Komanda [0] * len(max_taškai) tiesiog sukuria žodyno elementą – 0-ių sąrašą, kuris yra tokio pat ilgio kaip ir max_taškai sąrašas, kuriame vėliau bus sukelti pažymiai.

Pašalinti mokinį pasirinkimas tiesiog ištrina mokinį, panašiai kaip ir telefonų knygutės pavyzdyje. Įrašyti mokinį pasirinkimas yra šiek tiek sudėtingesnis. Pažymiai yra gaunami komandinėje eilutėje pažymiai = mokiniai[vardas], ji gauna nuorodą į mokinio vardas pažymius. Tada pažymys yra įrašomas komanda pažymiai[kuris] = pažymys. Tu gali pastebėti, kad pažymiai niekada negrąžinami į mokinių žodyną (tokios komandos niekada nerašome: mokiniai[vardas] = pažymiai). Pakeisto pažymių sąrašo į žodyną grąžinti nereikia todėl, kad komanda pažymiai[kuris] = pažymys mes gauname ne realų sąrašą, o nuorodą į tą sąrašą, tada pažymiai iš tiesų yra tik kitas mokiniai[vardas] pavadinimas. Dėl to, keičiant pažymiai keičiasi ir mokiniai[vardas].

Žodynai turi nesudėtingą metodą susieti raktus su reikšmėmis. Tai gali būti naudojama norint lengvai sekti duomenis, pridedamus prie įvairių raktų.

Pratimai

Parašyk balsų skaičiavimo programą, kurioje tu vedi vardus tol, kol yra įvedamas žodis "pabaiga". Tada programa išveda, visus vardus ir kiek kartų jis buvo įvestas.

Įvesits:

Benas, Liepa, Benas, Benas, Benas, Jonas, Liepa

Išvestis:

Benas 4
Liepa 2
Jonas 1
Sprendimas  
balsai = dict()
vardas = str()

def balsuoti(naujasBalsas, balsai):
    if naujasBalsas in balsai:
        balsai[naujasBalsas] += 1
    else:
        if naujasBalsas != "pabaiga":
            balsai[naujasBalsas] = 1

while vardas != "pabaiga":
    print("Įrašyk vardą ir spausk 'enter' klavišą")
    vardas = input()
    balsuoti(vardas, balsai)

print(balsai)
 ← Loginiai reiškiniai Turinys Modulių naudojimas →