Vaje iz slovarjev
Za vaje potrebuješ datoteko vremenske-postaje.txt. Poberi in odzipaj. Vsaka vrstica ima štiri podatke: ime vremenske postaje, datum meritve ter najvišjo in najnižjo izmerjeno temperaturo v tem dnevu.
- Kateri sta najvišja in najnižja temperatura, izmerjeni kadarkoli v Sloveniji (na eni od teh vremenskih postaj, ne drugo)? Odgovor: najvišja: - 40, najnižja: -32
Rešitev
najvisja_skupaj = -float("inf")
najnizja_skupaj = float("inf")
for v in open("vremenske-postaje.txt"):
    kraj, datum, najvisja, najnizja = v.split(",")
    najvisja, najnizja = int(najvisja), int(najnizja)
    if najvisja > najvisja_skupaj:
        najvisja_skupaj = najvisja
    if najnizja < najnizja_skupaj:
        najnizja_skupaj = najnizja
najvisja_skupaj = -float("inf")
najnizja_skupaj = float("inf")
for v in open("vremenske-postaje.txt"):
    kraj, datum, najvisja, najnizja = v.split(",")
    najvisja, najnizja = int(najvisja), int(najnizja)
    najvisja_skupaj = max(najvisja, najvisja_skupaj)
    najnizja_skupaj = min(najnizja, najnizja_skupaj)
- Izpiši najvišje temperature, izmerjene na vsaki posamični postaji. Odgovor: Murska Sobota 40, Črnomelj 40, Maribor 40, Brnik 38, Lisca 35, ...
Rešitev
najvisje = {}
for v in open("vremenske-postaje.txt"):
    kraj, datum, najvisja, najnizja = v.split(",")
    najvisja = int(najvisja)
    if kraj not in najvisje or najvisje[kraj] < najvisja:
        najvisje[kraj] = najvisja
for kraj, najvisja in najvisje.items():
    print(kraj, najvisja)
- Za vsako postajo zapiši največjo zabeleženo razliko med najnižjo in najvišjo temperaturo v istem dnevu. (Obstaja, na primer, kraj, v katerem se je v enem dnevu temperatura vzpela z -26 na 6. Mogoče te zanima tudi, kateri in kdaj?) Odgovor: Murska Sobota 29, Črnomelj 28, Maribor 24, Brnik 28, Lisca 17, ...
Rešitev
najvisje_razlike = {}
for v in open("vremenske-postaje.txt"):
    kraj, datum, najvisja, najnizja = v.split(",")
    razlika = int(najvisja) - int(najnizja)
    if kraj not in najvisje_razlike or najvisje_razlike[kraj] < razlika:
        najvisje_razlike[kraj] = razlika
for kraj, naj_razlika in najvisje_razlike.items():
    print(kraj, naj_razlika)
- Za vse vremenske postaje izpiši povprečja najvišjih dnevnih temperatur. (Opomba: klic round(x, 1)zaokroži podano številoxna eno decimalko.) Pazi: različni kraji imajo različno število meritev! Najbrž bosta potrebna dva slovarja. Odgovor: Murska Sobota 15.5, Črnomelj 17.1, Maribor 15.6, Brnik 14.9, Lisca 11.6, ...
Rešitev
from collections import defaultdict
vsote = defaultdict(int)
stevilo_temp = defaultdict(int)
for v in open("vremenske-postaje.txt"):
    kraj, datum, najvisja, najnizja = v.split(",")
    vsote[kraj] += int(najvisja)
    stevilo_temp[kraj] += 1
for kraj, vsota in vsote.items():
    print(kraj, round(vsota / stevilo_temp[kraj], 1))
- Ponovi točke 1-4 samo za letošnje leto. :) (Spomni se, da imajo nizi metodo startswith.)
Rešitev
Pri vsaki od rešitev je potrebno zgolj preveriti, da se datum začne z2023. To narediš z datum.startswith("2023").
1. Najvišja in najnižja temperatura:
najvisja_skupaj = -float("inf")
najnizja_skupaj = float("inf")
for v in open("vremenske-postaje.txt"):
    kraj, datum, najvisja, najnizja = v.split(",")
    najvisja, najnizja = int(najvisja), int(najnizja)
    if datum.startswith("2023"):
        najvisja_skupaj = max(najvisja, najvisja_skupaj)
        najnizja_skupaj = min(najnizja, najnizja_skupaj)
najvisje = {}
for v in open("vremenske-postaje.txt"):
    kraj, datum, najvisja, najnizja = v.split(",")
    najvisja = int(najvisja)
    if datum.startswith("2023") and (kraj not in najvisje or najvisje[kraj] < najvisja):
        najvisje[kraj] = najvisja
for kraj, najvisja in najvisje.items():
    print(kraj, najvisja)
najvisje_razlike = {}
for v in open("vremenske-postaje.txt"):
    kraj, datum, najvisja, najnizja = v.split(",")
    if datum.startswith("2023"):
        razlika = int(najvisja) - int(najnizja)
        if kraj not in najvisje_razlike or najvisje_razlike[kraj] < razlika:
            najvisje_razlike[kraj] = razlika
for kraj, naj_razlika in najvisje_razlike.items():
    print(kraj, naj_razlika)
from collections import defaultdict
vsote = defaultdict(int)
stevilo_temp = defaultdict(int)
for v in open("vremenske-postaje.txt"):
    kraj, datum, najvisja, najnizja = v.split(",")
    if datum.startswith("2023"):
        vsote[kraj] += int(najvisja)
        stevilo_temp[kraj] += 1
for kraj, vsota in vsote.items():
    print(kraj, round(vsota / stevilo_temp[kraj], 1))
- Izpiši imena vseh postaj in datume najstarejše meritev z vsake od njih. (Datumi so nizi, ki jih lahko primerjaš po abecedi; ker so oblike leto-mesec-dan, so starejši datumi prej po abecednem redu.) Odgovor: Murska Sobota - 1961-01-01, Črnomelj - 1989-01-01, Maribor - 1977-01-01, Brnik - 1964-01-01, Lisca - 1985-01-01, ...
Rešitev
najstarejse = {}
for v in open("vremenske-postaje.txt"):
    kraj, datum, najvisja, najnizja = v.split(",")
    if kraj not in najstarejse or najstarejse[kraj] > datum:
        najstarejse[kraj] = datum
for kraj, najstarejsa in najstarejse.items():
    print(kraj, najstarejsa)
- Kakšne so najvišje izmerjene temperature v Ljubljani za posamične mesece v letu? Se pravi, kakšna je bila najvišja temperatura januarja, februarja itn? (Izbereš lahko tudi drug kraj, recimo Kredarico.) (Nasvet: datum razbij na leto, mesec in dan. Potem predalčkaš po mesecih.) Odgovor: Januar 16, Februar 22, Marec 25, April 29, Maj 33, ...
Rešitev
najvisje_mesec = {}
for v in open("vremenske-postaje.txt"):
    kraj, datum, najvisja, najnizja = v.split(",")
    if kraj == "Ljubljana":
        najvisja = int(najvisja)
        leto, mesec, dan = datum.split("-")
        if mesec not in najvisje_mesec or najvisje_mesec[mesec] < najvisja:
            najvisje_mesec[mesec] = najvisja
for mesec, najvisja in najvisje_mesec.items():
    print(mesec, najvisja)
- Kaj pa povprečne (najvišje) temperature po mesecih? Odgovor: Januar 2.4, Februar 5.5, Marec 10.8, April 15.7, Maj 20.7, ...
Rešitev
from collections import defaultdict
vsota_mesec = defaultdict(int)
stevilo_mesec = defaultdict(int)
for v in open("vremenske-postaje.txt"):
    kraj, datum, najvisja, najnizja = v.split(",")
    if kraj == "Ljubljana":
        najvisja = int(najvisja)
        leto, mesec, dan = datum.split("-")
        vsota_mesec[mesec] += najvisja
        stevilo_mesec[mesec] += 1
for mesec, vsota in vsota_mesec.items():
    print(mesec, round(vsota/stevilo_mesec[mesec], 1))
- Če ti je zmanjkalo, si očitno lahko izmisliš še veliko nalog. :) Ena zanimiva bi bila, recimo, kakšna je bila povprečna julijska temperatura v Ljubljani leta 1900, 1901, 1902 in tako naprej. Da vidimo, kako nam kaj gre globalno segrevanje...