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)
|