Python Vadovėlis/Žodynai
Š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)
| |