$$ \newcommand{\floor}[1]{\left\lfloor{#1}\right\rfloor} \newcommand{\ceil}[1]{\left\lceil{#1}\right\rceil} \renewcommand{\mod}{\,\mathrm{mod}\,} \renewcommand{\div}{\,\mathrm{div}\,} \newcommand{\metar}{\,\mathrm{m}} \newcommand{\cm}{\,\mathrm{cm}} \newcommand{\dm}{\,\mathrm{dm}} \newcommand{\litar}{\,\mathrm{l}} \newcommand{\km}{\,\mathrm{km}} \newcommand{\s}{\,\mathrm{s}} \newcommand{\h}{\,\mathrm{h}} \newcommand{\minut}{\,\mathrm{min}} \newcommand{\kmh}{\,\mathrm{\frac{km}{h}}} \newcommand{\ms}{\,\mathrm{\frac{m}{s}}} \newcommand{\mss}{\,\mathrm{\frac{m}{s^2}}} \newcommand{\mmin}{\,\mathrm{\frac{m}{min}}} \newcommand{\smin}{\,\mathrm{\frac{s}{min}}} $$

Prijavi problem


Obeleži sve kategorije koje odgovaraju problemu

Još detalja - opišite nam problem


Uspešno ste prijavili problem!
Status problema i sve dodatne informacije možete pratiti klikom na link.
Nažalost nismo trenutno u mogućnosti da obradimo vaš zahtev.
Molimo vas da pokušate kasnije.

Rečnici

Sada ćemo upoznati još jednu vrstu složenih tipova podataka, odnosno kolekcija, koja je drugačija od onih koje smo do sada upoznali.

Pretpostavimo da treba da napišemo program koji odgovara na pitanja o starosti pojedinih osoba. Imena i starosti osoba su nam poznati, na primer Marija ima 14 godina, Mihajlo 15, Danijela takođe 15, a Nenad 16 (stvarni podaci bi bili mnogo obimniji, ali za ilustraciju je dovoljno i ovo).

Zadatak možemo da rešimo tako što imena smestimo u jednu torku, a starosti u drugu. Sa ovako organizovanim podacima možemo pomoću petlje da tražimo zadato ime u torki imena, pa kada ga nađemo, ispisujemo odgovarajuću starost.

Kao što vidimo, kolekcije koje već poznajemo mogu i u ovom slučaju da nam posluže. Ipak, za ovakvu vrstu zadataka postoji kolekcija u kojoj se podaci zapisuju na pregledniji način, a potreban podatak se pronalazi jednostavnije i mnogo efikasnije. Pogledajmo drugo rešenje:

Kolekcija oblika {’Marija’:14, ’Mihajlo’:15, ’Danijela’:15, ’Nenad’:16} se zove rečnik. Vidimo da rečnik može da se zada slično kao i torka i lista - nabrajanjem elemenata razdvojenih zarezima. Elementi rečnika se zapisuju između vitičastih zagrada { }. Svaki element se sastoji od dva dela između kojih stoji znak dvotačka :. Prvi deo elementa se naziva ključ, a drugi vrednost. Na primer, ključu ’Marija’ odgovara vrednost 14 itd.

Rečnike koristimo tako što za dati ključ brzo i lako dobijamo vrednost. U našem primeru smo za dato ime u rečniku pronalazili broj godina. U torkama i listama na sličan način pomoću rednog broja (indeksa) elementa dohvatamo vrednost elementa. Možemo da kažemo da ključ u rečniku ima onu ulogu koju indeks ima u torkama i listama. Suštinstka razlika rizmeđu rečnika sa jedne, i torki i listi sa druge strane, je u tome što u rečniku ključ može da bude bilo kojeg nepromenljivog tipa (ceo broj, realan broj, string, torka…) dok u torki ili listi indeksi moraju da budu celi brojevi redom od 0.

Formiranje rečnika

Rečnik možemo i da formiramo tokom rada programa. To radimo tako što u rečnik ubacujemo nove parove ključ - vrednost, a zatim po potrebi menjamo vrednost za dati ključ.

U sledećem primeru polazna torka sadrži imena fudbalskih klubova koji su u periodu 1956-2019 osvajali Kup evropskih šampiona, odnosno UEFA Ligu prvaka. Na osnovu tih podataka ćemo formirati rečnik u kome ćemo za svaki klub pamtiti broj osvojenih šampionata. Evo kako to možemo da uradimo.

Na početku formiramo prazan rečnik broj_titula. Za svaki klub iz spiska šampiona prvo proverimo da li klub već postoji u rečniku broj_titula. Ako postoji, na broj titula tog kluba dodajemo jedan, a ako ne postoji, upisujemo klub u rečnik sa jednom osvojenom titulom.

Po završetku prebrojavanja smo pomoću petlje prošli kroz rečnik i ispisali ključeve i vrednosti iz tog rečnika.

Jedan način da skratimo ovaj program je da koristimo funkciju (metodu) get, koja je deo svakog rečnika i poziva se sa ime_recnika.get(kljuc, podrazumevana_vrednost). Kao što vidimo, ova funkcija ima dva argumenta. Prvi argument je ključ za koji tražimo vrednost. U slučaju da taj ključ postoji u rečniku, funkcija get vraća vrednost koja odgovara tom ključu, a ako ključ nije u rečniku, funkcija vraća vrednost svog drugog argumenta. Tako na primer, umesto

if klub in broj_titula:
    broj_titula[klub] += 1
else:
    broj_titula[klub] = 1

možemo da pišemo

broj_titula[klub] = broj_titula.get(klub, 0) + 1

i efekat je isti. U ovom primeru broj_titula.get(klub, 0) vraća broj titula datog kluba ako je je on već u rečniku, odnosno 0 ako još nije. I u jednom i u drugom slučaju na tu vrednost treba da se doda 1 i da se nova vrednost sačuva u rečniku.

Zadaci za vežbu

Zadatak - cene namirnica

Cene u jednoj prodavnici su:

  • hleb: 1 (za veknu od pola kilograma)

  • mleko: 0.8 (za litar)

  • jaje: 0.08 (za komad)

  • pileća prsa: 7.3 (za kilogram)

  • jabuke: 2.2 (za kilogram)

  • paradajz: 1 (za kilogram)

Smestiti ove podatke u rečnik, a zatim dopuniti program tako da učitava naziv namirnice i ispisuje cenu te namirnice, ili informaciju da ta namirnica nije na raspolaganju.

Rešenje:

Zadatak - izostanci

U torki su data imena učenika koji su izostajali sa nastave. Svako pojavljivanje jednog imena predstavlja izostanak sa jednog časa. Dovršiti program tako da izračunava i ispisuje sa koliko je časova koji učenik izostao.

Da bismo vam pomogli da proverite program, dajemo i očekivani rezultat: za podatke date u torki izostali, treba da dobijete da Dragan ima 4 izostanka, Maja 3, Aleksandar 2, a Ljubica, Mirko, Ognjen, Petar, Rade i Olivera po jedan (ne nužno tim redom).

Zadatak - zalihe

Date su nabavke i prodaje robe u obliku torke parova. U svakom paru prvi element je naziv robe, a drugi promena stanja zaliha. Na primer, par (’sir’, -1.5) znači da se raspoloživa količina sira smanjila za 1.5 (toliko sira je prodato).

Dovršiti program koji na osnovu datih promena stanja izračunava i ispisuje stanje nakon tih promena. Smatrati da na početku nema nikakvih zaliha.

Proverite rezultat: za date podatke, treba da dobijete (u bilo kom redosledu)

  • sir 18.5

  • mleko 297

  • brašno 985

  • jaja 1988

  • riba 47

Ovde je najvažniji deo programa prolazak kroz sve parove. Radi jasnoće, svaki par iz torke promene odmah raspakujemo u promenljive namirnica, promena.