S to nalogo se vračamo za dva tedna nazaj. Napisati bo potrebno podobne funkcije, le da je zdaj finta v tem, da funkcije ne vsebujejo drugega kot en sam return. Če mora funkcija vrniti množico nečesa bo videti tako

def funkcija(...argumenti...):
    return { ...nekaj pametnega... }

Spet vemo, kdo je bil kje. Na primer takole:

obiski = [("Ana", "kava"), ("Berta", "kava"), ("Cilka", "telovadba"),
          ("Dani", "zdravnik"), ("Ana", "zdravnik"), ("Cilka", "kava"),
          ("Ema", "telovadba")]

Toplo priporočam, da se čez takšne sezname odpravite z zanko oblike

for oseba, aktivnost in obiski:

Če boste delali kaj bolj zapletenega, ste si sami krivi za posledice.

Obvezne naloge

Napiši naslednje funkcije.

  • aktivnosti(obiski) vrne množico vseh aktivnosti. Za gornji primer vrne {"kava", "zdravnik", "telovadba"}.

  • aktivnosti_osebe(oseba, obiski) vrne seznam vseh aktivnosti določene osebe v takšnem vrstnem redu, v kakršnem nastopajo v seznamu. Klic aktivnosti_osebe("Ana", obiski) vrne ["kava", "zdravnik"]. Nekatere osebe lahko gredo tudi večkrat na isto aktivnost. V enem od testov Ana dvakrat pije kavo.

  • kdo_tam(kje, obiski) vrne množico vseh oseb, ki so se udeležile določene aktivnosti. Klic kdo_tam("kava", obiski) vrne {"Ana", "Berta", "Cilka"}.

  • koliko_tam(kje, obiski) vrne število oseb, ki so bile na določenem kraju. Klic kdo_tam("kava", obiski) vrne 3, ker so bile na kavi tri osebe. Izjemoma tu želim, naj funkcija ne kliče funkcij, ki ste si jih napisali prej. Pač pa sme klicati druge Pythonove funkcije, če jih potrebuje.

Dodatne naloge

Niso težke. Za razliko od zadnje obvezne naloge, funkcije tu smejo klicati ena drugo (in tudi funkcije iz obveznega dela). Pravzaprav je to celo zaželeno in priporočljivo.

  • preberi_aktivnosti(ime_datoteke) dobi datoteko oblike

    Ana kava
    Berta kava
    Cilka telovadba
    Ana zdravnik
    

    in tako naprej. Funkcija vrne seznam obiskov v gornji obliki. Predpostaviti smeš, da so vsa imena oseb in aktivnosti dolga eno besedo (se pravi: imeni osebe in aktivnosti sta ločeni z enim in edinim presledkom).

    Datoteka ni priložena testom, temveč jo testi sproti sestavijo kar sami.

  • slovar_skupin(obiski) naj vrne slovar, katerega ključi so aktivnosti, pripadajoče vrednosti pa množice oseb, ki so se je udeležile. Za gornji primer funkcija vrne slovar {"kava": {"Ana", "Berta", "Cilka"}, "zdravnik": {"Dani", "Ana"}, "telovadba": {"Cilka", "Ema"}}.

  • skupine(obiski) naj vrne isto kot istoimenska funkcija pred dvema tednoma: seznam množic vseh oseb, ki so se srečale na posameznih aktivnostih. V gornjem primeru vrne [{"Ana", "Berta", "Cilka"}, {"Dani", "Ana"}, {"Cilka", "Ema"}]. Vrstni red elementov v seznamu ni pomemben. Če se znajdeš, je funkcija lahko precej trivialna.

  • okuzen(stvari) prejme seznam stvari, ki se jih nekdo dotakne ter vrne True, če je ta oseba potem okužena in False, če ni. Človek je okužen, če se dotakne kljuke, ne da bi se takoj zatem dotaknil mila. (Izjema je le, če je kljuka zadnja stvar, za katero vemo, da se je je dotaknil. V tem primeru bomo predpostavili, da si je šel nato umit roke, torej ni okužen.) Klic okuzen(["miza", "kljuka", "stol", "milo", "kljuka", "milo"] vrne True, ker se je za kljuko dotaknil stola. Klic okuzen(["miza", "kljuka", "milo", "milo", "kljuka", "milo"] vrne False, ker si je po vsakem dotikanju kljuke umil roke.

Malo bolj dodatna

Tole ni tako težko, je pa najbolj kul reč v vsej domači nalogi, tako da se splača pogledati.

Preberi si dokumentacijo funkcije reduce iz modula functools.

Potem ko to razumeš, smeš vedeti, tole. Recimo, da imamo s = [{1, 2, 3}, {1, 5}, {2, 6, 10}]. Če pokličemo reduce(set.union, s) dobimo unijo vseh množic iz s. Če ne veš, zakaj, ponovno preberi dokumentacijo reduce.

Napiši funkcijo okuzeni(skupine, kuzni), ki počne isto kot pred dvema tednoma. Prejme torej seznam skupin, kakršnega vrača prejšnja funkcija, in množico vseh, ki so okuženi z virusom. Vrniti mora množico vseh, ki so bili vsaj enkrat v stiku s kom, ki je bil okužen.

Klic okuzeni([{"Ana", "Berta", "Cilka"}, {"Dani", "Ana"}, {"Cilka", "Ema"}], {"Ema", "Dani"}) vrne {"Ana", "Cilka", "Dani", "Ema"}, saj Ema in Dani okužita Cilko in Dani.

Zadnja sprememba: torek, 17. marec 2026, 08.46