M06 Hjälp till uppgifter

På denna sidan kommer det finnas hjälp till lösning av uppgifter samt en fullt fungerande lösning i form av kod.

Att kopiera färdiga lösningar gör inte att du blir bättre på programmering, men det kan vara ett effektivt sätt att få lite hjälp för att bli en duktig programmerare. Det är ditt ansvar att använda hjälpen på rätt sätt.

Lösningsförslagen är inte alltid kommenterade i koden, tanken är att du skall kunna ta ner koden och själv förstå vad som händer genom att testa och formulera kommentarer för dig själv.

m06u01

kuber = [x**3 for x in range(1, 21)]
print(kuber)

m06u02

temperaturer = [18, 27, 22, 30, 15, 29]
över_25 = [temp for temp in temperaturer if temp > 25]
print(över_25)

m06u03

def högsta_lägsta(temp_lista):
    högsta = max(temp_lista)
    lägsta = min(temp_lista)
    return (högsta, lägsta)

temperaturer = [18, 27, 22, 30, 15, 29]
högst, lägst = högsta_lägsta(temperaturer)
print(f"Högsta temperaturen är {högst}°C och lägsta är {lägst}°C.")

m06u04

meter = [1.5, 3.2, 7.8]
centimeter = list(map(lambda m: m * 100, meter))
print(centimeter)

m06u05

konstanter = ['3.14', '9.81', '6.626', '1.602']
flyttal = list(map(float, konstanter))
print(flyttal)

m06u06

kommuner = [
    ('Göteborg', 600000), 
    ('Borås', 115000), 
    ('Alingsås', 42000), 
    ('Lerum', 45000), 
    ('Partille', 40000), 
    ('Mölndal', 70000), 
    ('Kungsbacka', 87000)
]

sorterade_kommuner = sorted(kommuner, key=lambda kommun: kommun[1])
print(sorterade_kommuner)

m06u07

kommuner = [
    ('Göteborg', 600000), 
    ('Borås', 115000), 
    ('Alingsås', 42000), 
    ('Lerum', 45000), 
    ('Partille', 40000), 
    ('Mölndal', 70000), 
    ('Kungsbacka', 87000)
]

mindre_50000 = [kommun for kommun in kommuner if kommun[1] < 50000]
print(mindre_50000)

m06u08

kommuner = [
    ('Göteborg', 600000), 
    ('Borås', 115000), 
    ('Alingsås', 42000), 
    ('Lerum', 45000), 
    ('Partille', 40000), 
    ('Mölndal', 70000), 
    ('Kungsbacka', 87000)
]

mindre_50000 = [kommun for kommun in kommuner if kommun[1] < 50000]
sorterade_mindre = sorted(mindre_50000, key=lambda kommun: kommun[1], reverse=True)
print(sorterade_mindre)

m06u09

elev = {
    "namn": "Alva",
    "ålder": 17,
    "program": "NA",
    "intressen": ["kemi", "musik", "klättring"]
}

for nyckel, värde in elev.items():
    print(f"{nyckel}: {värde}")

m06u10

import json

bok = {
    "titel": "Samtal med vänner",
    "författare": "Sally Rooney",
    "sidor": 304
}

# Spara till JSON-fil
with open("bok.json", "w", encoding='utf-8') as fil:
    json.dump(bok, fil, indent=2, ensure_ascii=False)

# Läsa in från fil
with open("bok.json", encoding='utf-8') as fil:
    data = json.load(fil)
    print(f"{data['titel']} har {data['sidor']} sidor.")

m06u11 - med shorthanded if

kurser = [
    {"namn": "Matematik 2c", "lärare": "Anna Berg", "lärobok": True},
    {"namn": "Fysik 1", "lärare": "Lars Nilsson", "lärobok": False},
    {"namn": "Programmering 1", "lärare": "Sara Eriksson", "lärobok": True}
]

for kurs in kurser:
    bok_text = "har lärobok" if kurs["lärobok"] else "har ingen lärobok"
    print(f"{kurs['namn']} undervisas av {kurs['lärare']} och {bok_text}.")

m06u11 - med vanlig if-sats

for kurs in kurser:
    if kurs["lärobok"]:
        bok_text = "har lärobok"
    else:
        bok_text = "har ingen lärobok"
    print(f"{kurs['namn']} undervisas av {kurs['lärare']} och {bok_text}.")

m06u12

klasser = [
    {
        "klass": "NA22",
        "elever": [
            {"namn": "Alva", "ålder": 17, "betyg": [10, 15, 15]},
            {"namn": "Joel", "ålder": 18, "betyg": [12.5, 15, 12.5]}
        ]
    },
    {
        "klass": "TE22",
        "elever": [
            {"namn": "Sara", "ålder": 17, "betyg": [20, 20, 17.5]},
            {"namn": "Omar", "ålder": 18, "betyg": [10, 10, 15]}
        ]
    }
]

for klass in klasser:
    for elev in klass["elever"]:
        medel = sum(elev["betyg"]) / len(elev["betyg"])
        print(f"{elev['namn']} ({klass['klass']}) har ett snitt på {medel:.1f}")

Projektuppgift, del 1

import json

# Ursprunglig datalista
mätningar = [
    {"plats": "Göteborg", "temp": 17.4, "nederbörd": 3.2, "datum": "2024-09-01"},
    {"plats": "Borås", "temp": 16.1, "nederbörd": 6.8, "datum": "2024-09-01"},
    {"plats": "Alingsås", "temp": 15.9, "nederbörd": 4.5, "datum": "2024-09-01"}
]

# Spara till JSON-fil
with open("klimatdata.json", "w", encoding="utf-8") as fil:
    json.dump(mätningar, fil, indent=2, ensure_ascii=False)

# Läsa in från fil
with open("klimatdata.json", encoding="utf-8") as fil:
    data = json.load(fil)

# Sortera data
sorterade = sorted(data, key=lambda m: m["nederbörd"], reverse=True)
print("Städer sorterade efter nederbörd:")
for mätning in sorterade:
    print(f"{mätning['plats']}: {mätning['nederbörd']} mm")

m06u13

elever = [
  {"namn": "Anna", "poäng": [5, 7, 6]},
  {"namn": "Nils", "poäng": [8, 6]},
  {"namn": "Lea", "poäng": [9]}
]

alla_poäng = []
for elev in elever:
    alla_poäng += elev["poäng"]

print("Totalt antal poäng:", len(alla_poäng))
print("Högsta poäng:", max(alla_poäng))
print("Lägsta poäng:", min(alla_poäng))
print("Medelpoäng:", round(sum(alla_poäng)/len(alla_poäng), 2))

m06u14

def filtrera_58(poänglista):
    return [p for p in poänglista if 4 < p < 9]
    # Uttrycket kan också skrivas (p > 4 and p < 9)

elever = [
  {"namn": "Ida", "poäng": [3, 7, 8]},
  {"namn": "Leo", "poäng": [5, 4]},
  {"namn": "Zara", "poäng": [9, 6]}
]

for elev in elever:
    höga = filtrera_58(elev["poäng"])
    print(elev["namn"], ":", höga)

m06u15

personer = [
  {"namn": "A", "favorit": "Hund"},
  {"namn": "B", "favorit": "Katt"},
  {"namn": "C", "favorit": "Katt"},
  {"namn": "D", "favorit": "Fågel"}
]

# Med if/else
antal1 = {}
for person in personer:
    djur = person["favorit"]
    if djur in antal1:
        antal1[djur] += 1
    else:
        antal1[djur] = 1

# Med get()
antal2 = {}
for person in personer:
    djur = person["favorit"]
    antal2[djur] = antal2.get(djur, 0) + 1

print("Med if/else:", antal1)
print("Med get():", antal2)

Projektuppgift, del 2

import json

# Läs in data
with open("klimatdata.json", encoding="utf-8") as fil:
    data = json.load(fil)

# Förbered dictionaries för temp och nederbörd
temp_summa = {}
temp_antal = {}
neder_summa = {}
neder_antal = {}

for rad in data:
    plats = rad["plats"]
    temp = rad["temp"]
    neder = rad["nederbörd"]

    temp_summa[plats] = temp_summa.get(plats, 0) + temp
    temp_antal[plats] = temp_antal.get(plats, 0) + 1

    neder_summa[plats] = neder_summa.get(plats, 0) + neder
    neder_antal[plats] = neder_antal.get(plats, 0) + 1

# Beräkna medelvärden
medel_temp = {plats: round(temp_summa[plats]/temp_antal[plats], 1) for plats in temp_summa}
medel_nederbörd = {plats: round(neder_summa[plats]/neder_antal[plats], 1) for plats in neder_summa}

print("Medeltemperatur per plats:")
print(medel_temp)

print("Medelnederbörd per plats:")
print(medel_nederbörd)

m06u17

import matplotlib.pyplot as plt

kommuner = ["Göteborg", "Borås", "Alingsås", "Lerum", "Kungsbacka"]
befolkning = [587000, 113000, 43000, 43000, 85000]

plt.bar(kommuner, befolkning, color=["blue", "green", "orange", "purple", "red"])
plt.xticks(rotation=30)
plt.title("Befolkning per kommun")
plt.xlabel("Kommun")
plt.ylabel("Antal invånare")

for i in range(len(kommuner)):
    plt.text(kommuner[i], befolkning[i] + 10000, str(befolkning[i]), ha="center")

plt.tight_layout()
plt.show()

m06u18

import matplotlib.pyplot as plt

år = ["2019", "2020", "2021", "2022", "2023"]
deltagare = [8, 12, 10, 15, 18]

plt.plot(år, deltagare, marker="o", color="blue")
plt.title("Teknikklubben – Antal deltagare")
plt.xlabel("År")
plt.ylabel("Deltagare")
plt.grid(True)

for i in range(len(år)):
    plt.text(år[i], deltagare[i] + 0.5, str(deltagare[i]), ha="center")

plt.tight_layout()
plt.show()

Projektuppgift del 3

import matplotlib.pyplot as plt

platser = ["Göteborg", "Borås", "Alingsås", "Lerum", "Kungsbacka"]
medel_temp = [16.7, 19.3, 18.6, 16.5, 15.5]
medel_nederbörd = [3.0, 3.4, 4.1, 5.6, 4.0]

fig, ax1 = plt.subplots()

ax1.bar(platser, medel_nederbörd, color="skyblue", label="Nederbörd (mm)")
ax1.set_ylabel("Nederbörd (mm)", color="skyblue")
ax1.tick_params(axis="y", labelcolor="skyblue")

ax2 = ax1.twinx()
ax2.plot(platser, medel_temp, color="red", marker="o", label="Temperatur (°C)")
ax2.set_ylabel("Temperatur (°C)", color="red")
ax2.tick_params(axis="y", labelcolor="red")

plt.title("Klimatdata – medelvärden per plats")
fig.tight_layout()
plt.show()

m06u19

import csv
from pprint import pprint

# Läs in filen
with open("resultat.csv", encoding="utf-8") as fil:
    reader = csv.DictReader(fil)
    data = list(reader)

# Konvertera poäng till int
for elev in data:
    elev["poäng"] = int(elev["poäng"])

# Bearbeta data
sammanfattning = {}
for elev in data:
    klass = elev["klass"]
    poäng = elev["poäng"]
    if klass not in sammanfattning:
        sammanfattning[klass] = {"poäng": [], "högst": poäng, "lägst": poäng}
    sammanfattning[klass]["poäng"].append(poäng)
    sammanfattning[klass]["högst"] = max(sammanfattning[klass]["högst"], poäng)
    sammanfattning[klass]["lägst"] = min(sammanfattning[klass]["lägst"], poäng)

# Räkna ut medelvärden och skriv ut
for klass, info in sammanfattning.items():
    medel = sum(info["poäng"]) / len(info["poäng"])
    print(f"{klass}: Medel={medel:.1f}, Högst={info['högst']}, Lägst={info['lägst']}")

m06u20

import csv

# Läs in resultat.csv
with open("resultat.csv", encoding="utf-8") as fil:
    reader = csv.DictReader(fil)
    data = list(reader)

# Konvertera poäng till int
for rad in data:
    rad["poäng"] = int(rad["poäng"])

# Skapa en sammanställning per klass
sammanfattning = {}
for rad in data:
    klass = rad["klass"]
    poäng = rad["poäng"]
    if klass not in sammanfattning:
        sammanfattning[klass] = {"poäng": [], "högst": poäng, "lägst": poäng}
    sammanfattning[klass]["poäng"].append(poäng)
    sammanfattning[klass]["högst"] = max(sammanfattning[klass]["högst"], poäng)
    sammanfattning[klass]["lägst"] = min(sammanfattning[klass]["lägst"], poäng)

# Förbered data för export
sammanfattning_lista = []
for klass, info in sammanfattning.items():
    medel = sum(info["poäng"]) / len(info["poäng"])
    sammanfattning_lista.append({
        "klass": klass,
        "medel": round(medel, 1),
        "högst": info["högst"],
        "lägst": info["lägst"]
    })

# Skriv till sammanfattning.csv
with open("sammanfattning.csv", mode="w", newline="", encoding="utf-8") as fil:
    writer = csv.DictWriter(fil, fieldnames=["klass", "medel", "högst", "lägst"])
    writer.writeheader()
    writer.writerows(sammanfattning_lista)

Projektuppgift del 4

import csv
import matplotlib.pyplot as plt

# Läs in klimatdata från CSV
with open("klimatdata_jan_mars.csv", encoding="utf-8") as fil:
    reader = csv.DictReader(fil)
    data = list(reader)

# Konvertera värden till float
for rad in data:
    rad["temp"] = float(rad["temp"])
    rad["nederbörd"] = float(rad["nederbörd"])

# Bearbeta data per ort
orter_data = {}
for rad in data:
    ort = rad["plats"]
    if ort not in orter_data:
        orter_data[ort] = {
            "temp": [], "nederbörd": [],
            "max": rad["temp"], "min": rad["temp"]
        }
    orter_data[ort]["temp"].append(rad["temp"])
    orter_data[ort]["nederbörd"].append(rad["nederbörd"])
    orter_data[ort]["max"] = max(orter_data[ort]["max"], rad["temp"])
    orter_data[ort]["min"] = min(orter_data[ort]["min"], rad["temp"])

# Sammanfatta resultat
orter = []
medeltemp = []
medelnederbörd = []
sammanfattning = []

for ort, info in orter_data.items():
    medelt = sum(info["temp"]) / len(info["temp"])
    medeln = sum(info["nederbörd"]) / len(info["nederbörd"])
    orter.append(ort)
    medeltemp.append(medelt)
    medelnederbörd.append(medeln)
    sammanfattning.append({
        "plats": ort,
        "medeltemp": round(medelt, 1),
        "medelnederbörd": round(medeln, 1),
        "högst": round(info["max"], 1),
        "lägst": round(info["min"], 1)
    })

# Stapeldiagram – medeltemperatur per ort
plt.figure(figsize=(10, 6))
plt.bar(orter, medeltemp)
plt.title("Medeltemperatur per ort")
plt.ylabel("Grader Celsius")
plt.xticks(rotation=30)
plt.grid(axis="y", linestyle="--", alpha=0.5)
plt.tight_layout()
plt.show()

# Stapeldiagram – medelnederbörd per ort
plt.figure(figsize=(10, 6))
plt.bar(orter, medelnederbörd, color="skyblue")
plt.title("Medelnederbörd per ort")
plt.ylabel("Millimeter")
plt.xticks(rotation=30)
plt.grid(axis="y", linestyle="--", alpha=0.5)
plt.tight_layout()
plt.show()

# Kombinerat diagram – två y-axlar
fig, ax1 = plt.subplots(figsize=(10, 6))
ax2 = ax1.twinx()
ax1.bar(orter, medelnederbörd, color="lightblue", label="Nederbörd")
ax2.plot(orter, medeltemp, color="red", marker="o", label="Temperatur")

ax1.set_ylabel("Nederbörd (mm)")
ax2.set_ylabel("Temperatur (°C)")
plt.title("Nederbörd och Temperatur per Ort")
plt.xticks(rotation=30)
ax1.grid(axis="y", linestyle="--", alpha=0.5)
plt.tight_layout()
plt.show()

# Spara sammanfattning till CSV
with open("sammanfattning_klimat.csv", mode="w", newline="", encoding="utf-8") as fil:
    writer = csv.DictWriter(fil, fieldnames=["plats", "medeltemp", "medelnederbörd", "högst", "lägst"])
    writer.writeheader()
    writer.writerows(sammanfattning)