Речници

Сада ћемо упознати још једну врсту сложених типова података, односно колекција, која је другачија од оних које смо до сада упознали.

Претпоставимо да треба да напишемо програм који одговара на питања о старости појединих особа. Имена и старости особа су нам познати, на пример Марија има 14 година, Михајло 15, Данијела такође 15, а Ненад 16 (стварни подаци би били много обимнији, али за илустрацију је довољно и ово).

Задатак можемо да решимо тако што имена сместимо у једну торку, а старости у другу. Са овако организованим подацима можемо помоћу петље да тражимо задато име у торки имена, па када га нађемо, исписујемо одговарајућу старост.

Као што видимо, колекције које већ познајемо могу и у овом случају да нам послуже. Ипак, за овакву врсту задатака постоји колекција у којој се подаци записују на прегледнији начин, а потребан податак се проналази једноставније и много ефикасније. Погледајмо друго решење:

Колекција облика {’Марија’:14, ’Михајло’:15, ’Данијела’:15, ’Ненад’:16} се зове речник. Видимо да речник може да се зада слично као и торка и листа - набрајањем елемената раздвојених зарезима. Елементи речника се записују између витичастих заграда { }. Сваки елемент се састоји од два дела између којих стоји знак двотачка :. Први део елемента се назива кључ, а други вредност. На пример, кључу ’Марија’ одговара вредност 14 итд.

Речнике користимо тако што за дати кључ брзо и лако добијамо вредност. У нашем примеру смо за дато име у речнику проналазили број година. У торкама и листама на сличан начин помоћу редног броја (индекса) елемента дохватамо вредност елемента. Можемо да кажемо да кључ у речнику има ону улогу коју индекс има у торкама и листама. Суштинстка разлика ризмеђу речника са једне, и торки и листи са друге стране, је у томе што у речнику кључ може да буде било којег непроменљивог типа (цео број, реалан број, стринг, торка…) док у торки или листи индекси морају да буду цели бројеви редом од 0.

Формирање речника

Речник можемо и да формирамо током рада програма. То радимо тако што у речник убацујемо нове парове кључ - вредност, а затим по потреби мењамо вредност за дати кључ.

У следећем примеру полазна торка садржи имена фудбалских клубова који су у периоду 1956-2019 освајали Куп европских шампиона, односно УЕФА Лигу првака. На основу тих података ћемо формирати речник у коме ћемо за сваки клуб памтити број освојених шампионата. Ево како то можемо да урадимо.

На почетку формирамо празан речник broj_titula. За сваки клуб из списка шампиона прво проверимо да ли клуб већ постоји у речнику broj_titula. Ако постоји, на број титула тог клуба додајемо један, а ако не постоји, уписујемо клуб у речник са једном освојеном титулом.

По завршетку пребројавања смо помоћу петље прошли кроз речник и исписали кључеве и вредности из тог речника.

Један начин да скратимо овај програм је да користимо функцију (методу) get, која је део сваког речника и позива се са ime_recnika.get(kljuc, podrazumevana_vrednost). Као што видимо, ова функција има два аргумента. Први аргумент је кључ за који тражимо вредност. У случају да тај кључ постоји у речнику, функција get враћа вредност која одговара том кључу, а ако кључ није у речнику, функција враћа вредност свог другог аргумента. Тако на пример, уместо

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

можемо да пишемо

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

и ефекат је исти. У овом примеру broj_titula.get(klub, 0) враћа број титула датог клуба ако је је он већ у речнику, односно 0 ако још није. И у једном и у другом случају на ту вредност треба да се дода 1 и да се нова вредност сачува у речнику.

Задаци за вежбу

Задатак - цене намирница

Цене у једној продавници су:

  • хлеб: 1 (за векну од пола килограма)

  • млеко: 0.8 (за литар)

  • јаје: 0.08 (за комад)

  • пилећа прса: 7.3 (за килограм)

  • јабуке: 2.2 (за килограм)

  • парадајз: 1 (за килограм)

Сместити ове податке у речник, а затим допунити програм тако да учитава назив намирнице и исписује цену те намирнице, или информацију да та намирница није на располагању.

Решење:

Задатак - изостанци

У торки су дата имена ученика који су изостајали са наставе. Свако појављивање једног имена представља изостанак са једног часа. Довршити програм тако да израчунава и исписује са колико је часова који ученик изостао.

Да бисмо вам помогли да проверите програм, дајемо и очекивани резултат: за податке дате у торки izostali, треба да добијете да Драган има 4 изостанка, Маја 3, Александар 2, а Љубица, Мирко, Огњен, Петар, Раде и Оливера по један (не нужно тим редом).

Задатак - залихе

Дате су набавке и продаје робе у облику торке парова. У сваком пару први елемент је назив робе, а други промена стања залиха. На пример, пар (’сир’, -1.5) значи да се расположива количина сира смањила за 1.5 (толико сира је продато).

Довршити програм који на основу датих промена стања израчунава и исписује стање након тих промена. Сматрати да на почетку нема никаквих залиха.

Проверите резултат: за дате податке, треба да добијете (у било ком редоследу)

  • сир 18.5

  • млеко 297

  • брашно 985

  • јаја 1988

  • риба 47

Овде је најважнији део програма пролазак кроз све парове. Ради јасноће, сваки пар из торке промене одмах распакујемо у променљиве namirnica, promena.