Vaje iz slovarjev
Zahteve zaključka
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
Lahko pa rešimo tudi tako:
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 številox
na 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)
2. Najvišja temperature po postajah:
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)
3. Najvišja razlika:
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)
4. Povprečje temperatur:
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...