Kino

Podan je seznam filmov in njihovih ocen (na imdb).

filmi = [
    ('Poletje v skoljki 2', 6.1), 
    ('Ne cakaj na maj', 7.3), 
    ('Pod njenim oknom', 7.1),
    ('Kekec', 8.1), 
    ('Poletje v skoljki', 7.2), 
    ('To so gadi', 7.7), 
]

Napiši program, ki izpiše:

  • imena vseh filmov z oceno vsaj 7,0,
Rešitev
for film, ocena in filmi:
    if ocena >= 7.0:
    print(film)
  • ime filma z najvišjo oceno,
Rešitev
naj_ocena = 0
for film, ocena in filmi:
    if ocena > naj_ocena:
        naj_ocena = ocena
        naj_film = film
print(naj_film)
  • povprečno oceno vseh filmov v seznamu,
Rešitev
vsota = 0
for _, ocena in filmi:
    vsota += ocena
print(vsota / len(filmi))
  • ime prvega filma v seznamu z oceno vsaj 7,0.
Rešitev
for film, ocena in filmi:
if ocena >= 7.0:
    print(film)
    break

Dražba

Nasveti:

  • preberi celotno datoteko z zapisnikom dražbe (zapisnik.txt iz zadnje domače naloge) v seznam seznamov.
  • Če greš s for zanko prek oštevilčenega seznama seznamov, potrebuješ for i, (predmet, oseba, cena) in enumerate(zapisnik). Zgolj for i, predmet, oseba, cena in enumerate(zapisnik) ne bi delovalo, ker tu ne gre za četvorke temveč za pare, pri katerem je drugi element para trojka.
  • z pred, os, ce = zapisnik[m] lahko razpakiraš m-ti element seznama. Če želiš in če ti pride prav. Zaradi preglednosti.
Rešitev
for film, ocena in filmi:
zapisnik = []
for vrstica in open("zapisnik.txt"):
    zapisnik.append(vrstica.split(","))

Sprogramiraj tole.

  1. Izpiši vse stvari, za katere se je zanimala Ana.
Rešitev
predmeti = []
for predmet, oseba, cena in zapisnik:
    if oseba == "Ana" and predmet not in predmeti:
        predmeti.append(predmet)
        print(predmet)
  1. Bi znal(a) sestaviti slovar, katerega ključi so imena oseb, vrednosti pa seznam vseh predmetov, za katere se je zanimala ta oseba?
Rešitev
zanimanja = defaultdict(list)
for predmet, oseba, cena in zapisnik:
    if predmet not in zanimanja[oseba]:
        zanimanja[oseba].append(predmet)
  1. Paranoični Cilki se zdi, da ima ena od ostalih nekaj proti njej. Izpiši ime osebe, ki je največkrat višala ponudbo (za določen predmet) neposredno za njo. Pazi: tule Dani ni višala Cilkine ponudbe, ker gre za drug predmet.

    Meldrumove vaze,Fanči,76
    Meldrumove vaze,Cilka,78
    skodelice,Dani,50
    skodelice,Berta,55
    

    Pravilen odgovor je Greta. Da je tako, razodeva tale slovar: {'Greta': 5, 'Ema': 2, 'Berta': 1, 'Dani': 3, 'Helga': 1}. Kaj vsebuje; razmisli sam(a). In potem si ga boš najbrž želel(a) tudi sestaviti. :)

Rešitev
visanja = defaultdict(int)
prejsnji_predmet, prejsnja_oseba = None, None
for predmet, oseba, cena in zapisnik:
    if prejsnji_predmet == predmet and prejsnja_oseba == "Cilka":
        visanja[oseba] += 1
    prejsnji_predmet, prejsnja_oseba = predmet, oseba

# sedaj najdemo še osebo, ki je največkrat višala
naj_st_visanj = 0
for oseba, st_visanj in visanja.items():
    if st_visanj > naj_st_visanj:
        naj_st_visanj = st_visanj
        naj_oseba = oseba
print(naj_oseba)
Lahko pa tudi rešimo tako, da v vsakem koraku zanjke pridobimo prejšnjo osebo iz seznama.
visanja = defaultdict(int)
for i, (predmet, oseba, cena) in enumerate(zapisnik[1:], start=1):
    prejsnji_predmet, prejsnja_oseba, _ = zapisnik[i-1]
    if prejsnji_predmet == predmet and prejsnja_oseba == "Cilka":
        visanja[oseba] += 1

# sedaj najdemo še osebo, ki je največkrat višala
naj_st_visanj = 0
for oseba, st_visanj in visanja.items():
    if st_visanj > naj_st_visanj:
        naj_st_visanj = st_visanj
        naj_oseba = oseba
print(naj_oseba)
  1. Cilka bi rada vedela, kdo so njene prijateljice. Izpiši vse osebe, ki so sodelovale na dražbi, vendar nikoli niso (neposredno) višale Cilkine ponudbe.

    (To sta očitno Ana in Fanči. Cilke ne izpisuj, saj je to ona sama.)

Rešitev Pri reševanju bomo uporabili slovar `visanja` iz prejšnje naloge. V tem slovarju pričakujemo, da se kot ključi ne pojavijo osebe, ki nikoli niso višale Cilkine ponudbe.
vse_osebe = []
for _, oseba, _ in zapisnik:
    if oseba not in vse_osebe:
        vse_osebe.append(oseba)
        if oseba not in visanja and oseba != "Cilka":
            print(oseba)
  1. Izpiši vse ljudi, ki so se potegovali za kip in sicer v takšnem vrstnem redu, kot so se pojavljali.
Rešitev
osebe_kip = []
for predmet, oseba, cena in zapisnik:
    if predmet == "kip" and oseba not in osebe_kip:
        osebe_kip.append(oseba)
        print(oseba)
  1. (Malo težja - niti ne, samo razmisliti je treba.) Isto kot 5, vendar jih izpiši po vrstnem redu izpadanja. Prva je obupala Cilka, nato Ema, potem Greta in na koncu ga je dobila Dani (izpiši tudi njo). Da vidiš, da res deluje, lahko ponoviš še za Meldrumove vaze (Ema, Ana, Greta, Fanči, Cilka).
Rešitev Ena možnost je, da osebo, vedno dodamo na konec seznama (append), še prej pa bomo morebitno pojavitev te osebe v seznamu odstranili. Tako poskrbimo, da so osebe, ki kasneje izstopijo, kasneje na seznamu.
osebe_kip = []
for predmet, oseba, cena in zapisnik:
    if predmet == "kip":
        if oseba in osebe_kip:
            osebe_kip.remove(oseba)
        osebe_kip.append(oseba)

for oseba in osebe_kip:
    print(oseba)
Če ne poznamo metode remove, pa je še lažje: rešitev je enaka rešitvi prejšnje naloge, le da spustimo zanko prek obrnjenega zapisnika, for predmet, oseba, cena in zapisnik[::-1]`. :)

Vreme

  1. Sestavi seznam najvišjih dnevnih temperatur v Ljubljani v 2022.
Rešitev
seznam_temp = []
for vrstica in open("vremenske-postaje.txt"):
    postaja, datum, najvisja, najnizja = vrstica.split(",")
    if postaja == "Ljubljana" and datum.startswith("2022"):
        seznam_temp.append(int(najvisja))
  1. Sestavi seznam povprečnih najvišjih julijskih temperatur v Ljubljani za vsako leto od prve meritve (1900). (V pomoč: [0] * 124 sestavi seznam s 124 ničlami. In še v pomoč: julij ima vsako leto točno 31 dni. Ne enega ne drugega ni nujno uporabiti, lahko pa pomaga.)
Rešitev
vsota_temp = [0] * 124
for vrstica in open("vremenske-postaje.txt"):
    postaja, datum, najvisja, _ = vrstica.split(",")
    leto, mesec, _ = datum.split("-")
    if postaja == "Ljubljana" and int(mesec) == 7:
        vsota_temp[int(leto) - 1900] += int(najvisja)

povprecje_temp = []
for vsota in vsota_temp:
    povprecje_temp.append(vsota / 31)
  1. Kakšno je bilo najvišja petdnevna povprečna temperatura v Ljubljani v 2022?
Rešitev V tem delu naloge lahko uporabimo kar seznam seznam_temp iz prvega dela naloge.
najvisja_temp = -float("inf")
for i in range(len(seznam_temp) - 5):
    # izračunamo petdnevno povprečje, ki se začne na indeksu i
    vsota = 0
    for temp in seznam_temp[i:i+5]:
        vsota += temp
    povprecje = vsota / 5

    # preverimo ali je povprečje višje od prejšnjega najvišjega
    if povprecje > najvisja_temp:
        najvisja_temp = povprecje
  1. Sestavi slovar, katerega ključi so vremenske postaje, vrednosti pa najvišja dnevna temperatura 1. oktobra 2023.
Rešitev
oktober_temp = {}
for vrstica in open("vremenske-postaje.txt"):
    postaja, datum, najvisja, _ = vrstica.split(",")
    if datum == "2023-10-01":
        oktober_temp[postaja] = int(najvisja)t
  1. Sestavi slovar, katerega ključi so vremenske postaje, vrednosti pa povprečne najvišje julijske temperature v 2023.
Rešitev
vsote_temp = defaultdict(int)
for vrstica in open("vremenske-postaje.txt"):
    postaja, datum, najvisja, _ = vrstica.split(",")
    if datum.startswith("2023-07"):
        vsote_temp[postaja] += int(najvisja)

povprecne_temp = {}
for postaja, vsota in vsote_temp.items():
    povprecne_temp[postaja] = vsota / 31
Zadnja sprememba: torek, 31. oktober 2023, 19.38