Vaje
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?
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)
- Poleg tega izpiši, na katerih postajah sta bili tidve temperaturi izmerjeni.
Rešitev
najvisja_skupaj = -float("inf")
najnizja_skupaj = float("inf")
najvisja_postaja = None
najnizja_postaja = None
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
najvisja_postaja = kraj
if najnizja < najnizja_skupaj:
najnizja_skupaj = najnizja
najnizja_postaja = kraj
- Poišči največjo zabeleženo razliko med najnižjo in najvišjo temperaturo v istem dnevu. (V enem izmed krajev se je v enem dnevu temperatura vzpela z -13 na 25). Izpiši še kraj in datum s to najvišjo dnevno razliko.
Rešitev
najvecja_razlika = -1
naj_postaja = None
naj_datum = None
for v in open("vremenske-postaje.txt"):
kraj, datum, najvisja, najnizja = v.split(",")
najvisja, najnizja = int(najvisja), int(najnizja)
razlika = najvisja - najnizja
if razlika > najvecja_razlika:
najvecja_razlika = razlika
naj_postaja = kraj
naj_datum = datum
- Ponovi točke 1-3 samo za leto 2023. :) (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)
Če računamo za posamezne kraje:
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:
Najvišja razlika celotnih podatkov:
najvecja_razlika = -1
naj_postaja = None
naj_datum = None
for v in open("vremenske-postaje.txt"):
kraj, datum, najvisja, najnizja = v.split(",")
najvisja, najnizja = int(najvisja), int(najnizja)
razlika = najvisja - najnizja
if datum.startswith("2023") and razlika > najvecja_razlika:
najvecja_razlika = razlika
naj_postaja = kraj
naj_datum = datum
Če računamo za posamezne postaje (in poznamo slovarje):
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 (SLOVARJI!):
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. Vsako samo enkrat. Upoštevaj, da si meritve z iste postaje sledijo -- ko gremo iz Murske Sobote na Črnomelj, se nikoli ne vračamo v Črnomelj.
Rešitev
Zapomnimo si, katera je bila zadnja postaja, za katero smo prebrali podatek (prejsnja). Ko je novoprebrana postaja (postaja) drugačna od prejšnje, smo dobili prvi podatek za novo postajo in jo izpišemo. Na začetku prejsnja nastavimo na (None), da bo zagotovo drugačna od kateregakoli prvega podatka.
prejsnja = None
for vrstica in open("vremenske-postaje.txt", encoding="utf8"):
postaja, datum, max_dnevna, min_dnevna = vrstica.strip().split(",")
if postaja != prejsnja:
print(postaja)
prejsnja = postaja
- Poleg tega izpiši pri vsaki postaji tudi datum prve in zadnje meritve. Za Mursko Soboto mora izpisati 1. 1. 1961 (in ne 1961-01-01 ali kaj podobnega). Predpostavi, da so meritve v datoteki urejene po datumih, od najstarejšega do najnovejšega.
Rešitev
Ponovno spremembe postaje lovimo s pomočjo spremenljivke z imenom prejšnje postaje. Prvi datum imamo takoj, ko dobimo prvi podatek za postajo. Težava se pojavi pri zadnjem datumu, saj moramo preprati vse podatke za določeno postajo, preden ga poznamo. Zato podatke za postajo izpišemo z zamikom - ko dobimo prvi podatek za naslednjo postajo izpišemo prvi in zadnji datum meritve za prejšnjo postajo (razen, ko prejšnja postaja še ni nastavljena). Vsakič, ko zaključimo obhod zanke, si zapomnimo datum (zadnji_datum). Ko preberemo prvi podatek za novo postajo, vemo, da bo v tej spremenljivki točno datum zadnje meritve za prejšnjo postajo.
Zaradi zamika pri izpisovanju moramo paziti, da ne pozabimo na zadnji kraj. Te podatke izpišemo ločeno po koncu zanke.
prejsnja = None
prejsnja = None
prvi_datum = None
zadnji_datum = None
for vrstica in open("vremenske-postaje.txt", encoding="utf8"):
postaja, datum, max_dnevna, min_dnevna = vrstica.strip().split(",")
if postaja != prejsnja:
if prejsnja is not None:
# Oblikujemo izpis datuma
prvo_leto, prvi_mesec, prvi_dan = prvi_datum.split("-")
zadnje_leto, zadnji_mesec, zadnji_dan = zadnji_datum.split("-")
izpis_prvi = prvi_dan.lstrip("0") + ". " + prvi_mesec.lstrip("0") + ". " + prvo_leto
izpis_zadnji = zadnji_dan.lstrip("0") + ". " + zadnji_mesec.lstrip("0") + ". " + zadnje_leto
print(prejsnja + " od " + izpis_prvi + " do " + izpis_zadnji)
prvi_datum = datum
prejsnja = postaja
zadnji_datum = datum
# Dodamo izpis za zadnji kraj
prvo_leto, prvi_mesec, prvi_dan = prvi_datum.split("-")
zadnje_leto, zadnji_mesec, zadnji_dan = zadnji_datum.split("-")
izpis_prvi = prvi_dan.lstrip("0") + ". " + prvi_mesec.lstrip("0") + ". " + prvo_leto
izpis_zadnji = zadnji_dan.lstrip("0") + ". " + zadnji_mesec.lstrip("0") + ". " + zadnje_leto
print(prejsnja + " od " + izpis_prvi + " do " + izpis_zadnji)
- Poleg tega za vsako postajo izpiši najvišje temperature, izmerjene na njej. Odgovor: Murska Sobota 40, Črnomelj 40, Maribor 40, Brnik 38, Lisca 35, ... Upoštevaj, da je datoteka sestavljena tako, da si vse meritve na neki postaji sledijo.
Rešitev
prejsnja = None
for vrstica in open("vremenske-postaje.txt", encoding="utf8"):
postaja, datum, max_dnevna, min_dnevna = vrstica.strip().split(",")
max_dnevna = int(max_dnevna)
if postaja != prejsnja:
if prejsnja is not None:
print(prejsnja + ": " + str(max_postaja))
max_postaja = max_dnevna
elif max_dnevna > max_postaja:
max_postaja = max_dnevna
prejsnja = postaja
# Izpišemo še za zadnjo postajo
print(postaja + ": " + str(max_postaja))
Ko bomo delali s slovarji, bo zadeva nekoliko elegantnejša:
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
prejsnja = None
for vrstica in open("vremenske-postaje.txt", encoding="utf8"):
postaja, datum, max_dnevna, min_dnevna = vrstica.strip().split(",")
max_dnevna = int(max_dnevna)
min_dnevna = int(min_dnevna)
razlika = max_dnevna - min_dnevna
if postaja != prejsnja:
if prejsnja is not None:
print(prejsnja + ": " + str(max_razlika))
max_razlika = razlika
elif razlika > max_razlika:
max_razlika = razlika
prejsnja = postaja
print(postaja + ": " + str(max_razlika))
Ko bomo delali s slovarji, bo zadeva nekoliko elegantnejša:
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! Odgovor: Murska Sobota 15.5, Črnomelj 17.1, Maribor 15.6, Brnik 14.9, Lisca 11.6, ...
Rešitev
prejsnja = None
for vrstica in open("vremenske-postaje.txt", encoding="utf8"):
postaja, datum, max_dnevna, min_dnevna = vrstica.strip().split(",")
max_dnevna = int(max_dnevna)
if postaja != prejsnja:
if prejsnja is not None:
print(prejsnja + ": " + str(round(vsota / st_podatkov, 1)))
vsota = 0
st_podatkov = 0
vsota += max_dnevna
st_podatkov += 1
prejsnja = postaja
print(prejsnja + ": " + str(round(vsota / st_podatkov, 1)))
Ko bomo delali s slovarji, bo zadeva nekoliko elegantnejša:
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))
- Tole bo zelo zoprno -- lahko rešuješ tudi le toliko časa, da vidiš, kako zoprno je. :) 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
izbrana_postaja = "Ljubljana"
# Za vsak mesec nastavimo novo spremenljivko in začnemo z neko zelo nizko vrednostjo
jan = feb = mar = apr = maj = jun = jul = avg = sep = okt = nov = dec = -float("inf")
for vrstica in open("vremenske-postaje.txt", encoding="utf8"):
postaja, datum, max_dnevna, min_dnevna = vrstica.strip().split(",")
# Upoštevamo samo izbrano postajo
if postaja == izbrana_postaja:
max_dnevna = int(max_dnevna)
leto, mesec, dan = datum.split("-")
# Če je januar in imamo temperaturo, višjo od vseh januarskih do sedaj
if mesec == 1 and max_dnevna > jan:
jan = max_dnevna
# Če je februar...
elif mesec == 2 and max_dnevna > feb:
feb = max_dnevna
elif mesec == 3 and max_dnevna > mar:
mar = max_dnevna
# In tako naprej za vse ostale mesece
print("Najvišje dnevne temperature na postaji", izbrana_postaja, "po mesecih:")
print("Januar:", jan)
print("Februar:", feb)
print("Marec:", mar)
# In tako naprej za vse ostale mesece
S slovarji gre elegantneje:
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)
- Za tole velja enak komentar kot za prejšnjo nalogo. 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
izbrana_postaja = "Ljubljana"
# Za vsak mesec nastavimo novo spremenljivko za vsoto, nato pa še za števec podatkov
jan_vsota = feb_vsota = mar_vsota = apr_vsota = maj_vsota = jun_vsota = jul_vsota = avg_vsota = sep_vsota = okt_vsota = nov_vsota = dec_vsota = 0
jan_dnevi = feb_dnevi = mar_dnevi = apr_dnevi = maj_dnevi = jun_dnevi = jul_dnevi = avg_dnevi = sep_dnevi = okt_dnevi = nov_dnevi = dec_dnevi = 0
for vrstica in open("vremenske-postaje.txt", encoding="utf8"):
postaja, datum, max_dnevna, min_dnevna = vrstica.strip().split(",")
# Upoštevamo samo izbrano postajo
if postaja == izbrana_postaja:
max_dnevna = int(max_dnevna)
leto, mesec, dan = datum.split("-")
# Če je januar
if mesec == "01":
jan_vsota += max_dnevna
jan_dnevi += 1
# Če je februar
elif mesec == "02":
feb_vsota += max_dnevna
feb_dnevi += 1
elif mesec == "03":
mar_vsota += max_dnevna
mar_dnevi += 1
# In tako naprej za vse ostale mesece
print("Povprečne najvišje dnevne temperature na postaji", izbrana_postaja, "po mesecih:")
print("Januar:", round(jan_vsota / jan_dnevi, 1))
print("Februar:", round(feb_vsota / feb_dnevi, 1))
print("Marec:", round(mar_vsota / mar_dnevi, 1))
# In tako naprej za vse ostale mesece
S slovarji gre elegantneje:
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))