4. Moment04 - Iterationer och listor

Info

Till detta moment finns en sida med lösningsförslag och videoklipp.

För de elever som vill utmanas ytterligare med fler och/eller svårare uppgifter hittar dessa här.

4.1 Iteration – upprepning i kod

Iteration är ett annat ord för upprepning. Inom matematiken och i programmering handlar iteration om att en funktion eller process upprepar beräkningar eller andra operationer tills ett önskat resultat uppnåtts. I Python kommer du framför allt att använda två typer av loopar:

  • for-loop – när du vet hur många gånger något ska upprepas (antal varv)
  • while-loop – när du vill upprepa något så länge ett villkor är uppfyllt

Vi börjar med for-loopen, som är den mest styrda loopen.

4.1.1 Första for-loopen

Ett första exempel på en for-loop som körs fem varv:

Kodexempel: enkel for-loop, anger antalet gånger loopen körs

for i in range(5):
    print(i)

När du kör koden ovan blir utskriften:

Utskrift

0
1
2
3
4

Funktionen range(5) skapar en talföljd som börjar på 0 och slutar precis innan 5. Loopen körs alltså fem varv: för i = 0, 1, 2, 3, 4.

Vi kan skriva samma loop mer tydligt genom att ange både start- och stoppvärde:

Kodexempel: enkel for-loop med start- och stoppvärden

for i in range(0, 5):
    print(i)

Detta ger exakt samma utskrift som det första exemplet.

  • Första talet i range() är startvärde (inkluderas).
  • Andra talet är stoppvärde. stoppvärdet är aldrig med i talföljden.

Om variabelnamnet i en for-loop

I en for-loop använder man ofta variabelnamnet i av tradition. Det står ofta för index eller iteration. Men det är viktigt att veta att variabeln kan heta vad som helst!

Ofta kan det vara tydligare att använda ett mer beskrivande namn. Till exempel:

Exempel

for år in range(1, 6):
    print("År:", år)

Använd i om loopen är kort eller generell, men välj ett mer beskrivande namn när det hjälper läsbarheten.

4.1.2 Start, stopp och steg

Ibland vill vi inte räkna alla tal ett och ett, utan hoppa i större steg. Vi kan också ge range() ett tredje argument: stegstorleken.

Kodexempel: enkel for-loop med bestämd steglängd

# Räkna från 1 till 9, i steg om 2
for tal in range(1, 10, 2):
    print(tal)

Utskrift:

Utskrift

1
3
5
7
9

Här börjar vi på 1, går upp till men inte med 10, och hoppar i steg om 2. Talserien blir alltså 1, 3, 5, 7, 9.

Värdena i range(start, stopp, steg) betyder:

  • start – första talet i serien (tas med)
  • stopp – sista gränsen (tas inte med)
  • steg – hur mycket talet ökar (eller minskar) för varje varv

Negativ steglängd i range()

Om steglängden är negativ räknar loopen baklänges. Då måste start-värdet vara större än stopp-värdet, annars körs loopen aldrig.

Exempel: räkna nedåt

for tal in range(10, 0, -1):
    print(tal)

Talet minskar med 1 för varje varv eftersom steglängden är -1.

Övning 4.1a – Summera tal i en for-loop

I denna övning tränar du på att summera tal inuti en for-loop.

  1. Skriv ut alla tal från 1 till 20 i en for-loop.
  2. Beräkna samtidigt summan av alla talen.
  3. Skriv ut totalsumman efter loopen.

Lösningsförslag

summa = 0

for tal in range(1, 21):
    print(tal)
    summa += tal

print(f"Summan av alla talen är {summa}")

Övning 4.1b – Träna på range()

Denna övning hjälper dig att förstå hur range() fungerar med olika parametrar.

  1. Skriv ut talen 0 till 4 med range(5).
  2. Skriv ut talen 3 till 8 med range(3, 9).
  3. Skriv ut talen 2, 5, 8, 11 med range() och steg.
  4. Skriv ut talen 10 ned till 1 med negativt steg.

Lösningsförslag

# 1
for i in range(5):
    print(i)

# 2
for i in range(3, 9):
    print(i)

# 3
for i in range(2, 12, 3):
    print(i)

# 4
for i in range(10, 0, -1):
    print(i)

Nu har du testat for-loopar med range(). Dags att använda dem i lite större uppgifter.

Uppgift: m04u01

Skriv ut alla tal från 1 till 10, i steg om 2, med hjälp av en for-loop.

Multiplicera sedan värdet på alla dessa tal och skriv ut svaret.

Vidareutveckling: kodkalendern 2021, lucka 1

Med m04u01 som grund så går det att bygga vidare för att lösa Unga programmerares kodkalender lucka 1 år 2021. Så det blir uppgiften, hitta den sexsiffriga pinkoden.

Uppgift: m04u02

Ulf har satt in 10 000kr på ett konto med 3 % årlig ränta, hur mycket pengar finns på kontot efter 15 år? Inga fler insättningar görs.
Välj själv hur du vill skriva ut svaret, med en enda rad efter färdig uträkning eller en rad för varje år.

Tips1: Under utveckling är det smart att skriva ut på varje rad för att se att du har tänkt, och beräknat, allt rätt.

Tips2: Om du inte vet hur du skall ställa upp din for-loop så fundera på hur du skulle lösa denna uppgiften på en matematiklektion utan miniräknare.

Fördjupning m04u02a [klicka för att visa]

Bygg ut applikationen så att sparbelopp, antal år och räntan går att mata in till systemet. Räntan vill jag ange som ett decimaltal, t.ex. 3,50%.

Fördjupning m04u02b [klicka för att visa]

För att utveckla applikationen ytterligare och skapa en sparsimulator så skulle jag vilja att du fixar möjlighet att spara nya pengar varje år. Om Ulf sätter in 0kr på kontot från början, nysparar 15000kr/år (barn-/studiebidraget) till 6.5% ränta i 18 år så har han 486151kr på kontot. Detta utgår ifrån att han inte får ränta på detta års insatta pengar, men på alla pengar som fanns där när året började.

4.1.3 Nästlade iterationer

Ibland behöver vi göra en loop inuti en annan loop. Detta kallas för en nästlad iteration (eller "loop i loop"). Det används när något behöver upprepas i två led – till exempel rader och kolumner, eller kombinationer av två olika värden.

Ett enkelt sätt att tänka på nästlade loopar är:

  • Yttre loopen – bestämmer hur många “rader” som ska göras
  • Inre loopen – fyller varje rad med värden

Kodexempel: multiplikationstabeller för 6:an och 7:an

# 6:ans och 7:ans multiplikationstabeller

for i in range(6, 8):          # Yttre loop: tabell 6 och tabell 7
    for j in range(1, 11):     # Inre loop: talen 1–10
        print(f"{i} * {j} = {i * j}")
    print()                    # Tom rad mellan tabellerna

Förklaring:

  • När i = 6 körs innerloopen 10 gånger (1–10)
  • När i = 7 körs innerloopen igen (1–10)
  • Den inre loopen kör alltså klart varje gång innan den yttre går vidare

Utskrift (förkortad)

6 * 1 = 6
6 * 2 = 12
...
6 * 10 = 60

7 * 1 = 7
7 * 2 = 14
...
7 * 10 = 70

Övning 4.1c – Alla kombinationer av två tärningar

Skriv ett program som visar alla kombinationer när två tärningar kastas.

  1. Den första tärningen ska loopas från 1 till 6.
  2. Den andra tärningen ska loopas från 1 till 6.
  3. Skriv ut varje kombination, t.ex. 1 + 3, 4 + 6 osv.

Lösningsförslag

for t1 in range(1, 7):
    for t2 in range(1, 7):
        print(t1, "+", t2)

Uppgift: m04u03

Skapa en multiplikationstabell som ritar ut alla tal upp till tians multiplikationstabell. Viktigt här är att göra en bra formatering så att alla siffror ligger i raka kolumner.

Utbyggnad 1: Låt användaren mata in ett heltal och skriv ut en multiplikationstabell upp till det talet.

Utbyggnad 2: Se till att tabellen inte kan vara större än 15×15.

Utbyggnad 3: Om användaren matar in ett negativt tal ska du fundera över hur du vill hantera det. Vänd talet, ta absolutbeloppet eller något annat?

Utbyggnad 4: Gör det möjligt att skapa rektangulära tabeller, till exempel 12×6.

Exempelutskrift

Multiplikationstabell

  1  2  3  4  5
  2  4  6  8 10
  3  6  9 12 15
  4  8 12 16 20
  5 10 15 20 25

4.1.4 Iteration som testmetod

En loop används inte bara för att räkna tal eller skriva ut serier. Den kan också vara ett kraftfullt sätt att testa hur ett uttryck fungerar för många olika värden.

I stället för att mata in värden manuellt kan vi låta en loop prova alla tänkbara fall åt oss. Det här är väldigt användbart när vi vill kontrollera om vår logik fungerar som vi tänkt.

Kodexempel: Testa skoldag-logiken för alla timmar på dygnet

for timme in range(0, 24):              # Testa alla timmar 0–23
    print(f"Klockan är {timme}, ", end="")

    if timme < 8:
        print("skoldagen har inte börjat.")
    elif timme > 16:
        print("skoldagen är slut.")
    else:
        print("skoldagen pågår.")

Fördelen här är att vi kan se exakt vid vilka tider gränserna slår om – utan att skriva in något själva.

Kodexempel: testa ett villkor för alla tal 1–30

for tal in range(1, 31):
    if tal % 3 == 0:
        print(f"{tal} är delbart med 3")

Detta är ett vanligt sätt att testa eller felsöka villkor.

Övning 4.1d – Testa dina uttryck

Använd en for-loop för att testa ett uttryck för många värden.

  1. Skriv en loop som testar alla tal från 1 till 40.
  2. Skriv ut alla tal som är jämnt delbara med 5.
  3. Skriv också ut alla tal som är både delbara med 2 och 3.

Lösningsförslag

for tal in range(1, 41):

    if tal % 5 == 0:
        print(f"{tal} är delbart med 5")

    if tal % 2 == 0 and tal % 3 == 0:
        print(f"{tal} är delbart med både 2 och 3")

Uppgift: m04u03b

Bygg vidare på den multiplikationstabell du skapade i föregående uppgift. Det tal som användaren matar in ska avgöra hur många tabeller som ska skrivas ut.

Om användaren skriver in 3 ska programmet alltså skriva ut:

  • Multiplikationstabell för 1×1
  • Multiplikationstabell för 2×2
  • Multiplikationstabell för 3×3

Utskriftsexempel

Ange vilken multiplikationstabell: 3

Multiplikationstabell upp till 1x1
1

Multiplikationstabell upp till 2x2
1 2
2 4

Multiplikationstabell upp till 3x3
1 2 3
2 4 6
3 6 9

4.2 while-loop

En while-loop används när vi vill upprepa kod så länge ett villkor är sant. Till skillnad från for-loopen är det alltså inte bestämt i förväg hur många varv loopen körs. Strukturen ser ut så här:

Struktur för while-loop

while villkor:
    kod som upprepas

Ett första exempel på en while-loop som körs fem varv:

Kodexempel: räkna uppåt

tal = 1

while tal <= 5:
    print(tal)
    tal += 1                 # viktiga raden!

Förklaring:

  • Loopen körs så länge tal <= 5 är sant.
  • Efter varje varv ökar vi tal med 1.
  • När tal blir 6 avslutas loopen.

Viktigt!

Var noga med att ändra variabeln!

Om du glömmer att ändra variabeln som styr villkoret kan du få en oändlig loop som aldrig slutar.

Kodexempel: oändlig loop

tal = 1

while tal <= 5:
    print(tal)     # tal ändras aldrig → loopen kör för alltid!

Övning 4.2a – Räkna uppåt med while

  1. Skriv ett program som räknar från 1 till 15 med en while-loop.
  2. Skriv ut alla talen på varsin rad.

Lösningsförslag

tal = 1

while tal <= 15:
    print(tal)
    tal += 1

Övning 4.2b – nedräkning

  1. Skriv ett program som räknar ned från 20 till 0.
  2. När loopen når 0 ska programmet skriva ut Klart!.

Lösningsförslag

tal = 20

while tal >= 0:
    print(tal)
    tal -= 1

print("Klart!")

Uppgift: m04u04

Skriv ut alla tal från 10 till 1 med hjälp av en while-loop.

Multiplicera sedan värdet på alla dessa tal och skriv ut svaret.

Uppgift: m04u05

Antalet råttor i en stad är 100 stycken, varje månad dubblas populationen av råttor, hur många månader dröjer det innan det finns en miljon råttor i staden? Lös uppgiften med en while-loop.

Tips: Under utveckling är det smart att skriva ut på varje rad för att se att du har tänkt, och beräknat, allt rätt.

4.2.1 break – avbryta en loop

Ibland vill vi kunna avbryta en loop i förtid, även om villkoret fortfarande är sant (för while) eller om det finns fler varv kvar (för for-loopar). Då använder vi nyckelordet break.

När Python kör ett break inuti en loop:

  • hoppar programmet ut ur loopen direkt
  • fortsätter på första raden efter loopen

Kodexempel: while-loop med break

while True:
    text = input("Skriv något (eller 'stop' för att avsluta): ")

    if text == "stop":
        print("Avslutar loopen.")
        break              # hoppar ut ur loopen

    print("Du skrev:", text)

print("Utanför loopen.")

Förklaring:

  • while True betyder att loopen i teorin kan köra för alltid.
  • När användaren skriver stop körs break och loopen avslutas direkt.
  • Programmet fortsätter sedan på raden print("Utanför loopen.").

Vanligt mönster

Kombinationen while True + break används ofta när man inte vet i förväg hur många gånger loopen ska köras – till exempel vid inmatning från användaren.

break fungerar på samma sätt i en for-loop. Här stoppar vi loopen så fort vi hittar det första talet som är delbart med 9.

Kodexempel: break i en for-loop

for tal in range(1, 50):
    print(f"Kollar talet: {tal}")

    if tal % 9 == 0:         # första talet som är delbart med 9
        print(f"Hittade ett tal delbart med 9: {tal}")
        break                # avbryt loopen direkt

print("Klar med sökningen!")

Förklaring:

  • Loopen testar talen 1–49.
  • När den når 9 är villkoret tal % 9 == 0 sant.
  • break stoppar loopen direkt – talen efter 9 testas inte.

Vad händer efter break?

All kod under break på samma indenteringsnivå hoppar Python över. Programmet fortsätter på raden efter loopen.

Övning 4.2c – Avsluta på rätt signal

I denna övning tränar du på att använda break för att avsluta en while-loop.

  1. Skapa en while True-loop.
  2. I loopen frågar du användaren efter ett heltal.
  3. Om användaren skriver 0, ska loopen avbrytas med break.
  4. Annars skriver programmet ut talet och fortsätter fråga.

Lösningsförslag

while True:
    tal = int(input("Ange ett heltal (0 för att avsluta): "))

    if tal == 0:
        print("Du valde att avsluta.")
        break

    print("Du skrev talet:", tal)

print("Programmet är klart.")

Övning 4.2d – Hitta första delbara talet

Nu använder vi break i en for-loop för att hitta ett tal som uppfyller ett villkor.

  1. Skriv en for-loop som går igenom talen från 1 till 100.
  2. Hitta det första talet som är jämnt delbart med 7 och större än 50.
  3. När du hittat talet, skriv ut det och avbryt loopen med break.

Lösningsförslag

for tal in range(1, 101):
    if tal > 50 and tal % 7 == 0:
        print("Första talet som är > 50 och delbart med 7 är:", tal)
        break

print("Sökningen är klar.")

4.2.2 continue – hoppa över ett varv

Ibland vill vi hoppa över delar av koden i en loop, men ändå låta loopen fortsätta med nästa varv. Då använder vi nyckelordet continue.

När Python kör continue:

  • hoppar programmet över resten av koden i loopen
  • går vidare direkt till nästa varv i loopen

Kodexempel: for-loop med continue

for tal in range(1, 11):
    if tal % 2 != 0:     # om talet är udda
        continue         # hoppa över utskriften
    print(tal)

Utskrift

2
4
6
8
10

Förklaring: När loopen träffar ett udda tal körs continue, och loopen hoppar till nästa tal. Därför skrivs bara jämna tal ut.

Kodexempel: hoppa över vokaler

text = "programmering"

for bokstav in text:
    # kontrollera om bokstaven finns i strängen med alla vokaler
    if bokstav in "aeiouyåäö":
        continue      # hoppa över vokalerna
    print(bokstav, end="")

Utskrift

prgrmmrng

I tidigare exempel har vi loopat igenom en talserie med range(), men en for-loop kan också gå igenom en sträng ett tecken i taget. I exemplet ovan får variabeln bokstav alltså värdet av nästa tecken varje varv.

Villkoret if bokstav in "aeiouyåäö": kontrollerar om tecknet är en vokal. Uttrycket in används här för att se om ett värde finns i en samling (i detta fall en sträng).

Detta är ett vanligt sätt att filtrera bort vissa värden i en loop, och du kommer använda in ofta när du senare arbetar med olika typer av listor.

Akta dig för oändliga loopar

Om continue används i en while-loop innan variabeln hinner uppdateras kan loopen fastna. Variabeln ändras aldrig – villkoret är alltid sant.

Felaktig kod

tal = 0

while tal < 10:
    if tal % 2 == 0:
        continue      # tal ökar aldrig → oändlig loop!
    tal += 1

Rätt version (flytta ökningen ovanför continue):

Korrekt kod

tal = 0

while tal < 10:
    tal += 1
    if tal % 2 == 0:
        continue
    print(tal)

Övning 4.2e – Hoppa över alla tal delbara med 3

  1. Skriv en loop som går genom talen 1–30.
  2. Om talet är delbart med 3, hoppa över det med continue.
  3. Skriv ut övriga tal.

Lösningsförslag

for tal in range(1, 31):
    if tal % 3 == 0:
        continue
    print(tal)

Övning 4.2f – Filtrera text

  1. Be användaren skriva in en text.
  2. Skriv ut alla tecken i texten utom mellanslag.
  3. Använd continue för att hoppa över mellanslag.

Lösningsförslag

text = input("Skriv en mening: ")

for bokstav in text:
    if bokstav == " ":
        continue
    print(bokstav)

4.2.3 Pseudokod för loopar

I Moment03 tränade du på att skriva pseudokod för sekvenser och val (if-satser). Nu ska vi titta på hur pseudokod kan användas för att beskriva iteration, alltså upprepning av kod.

Pseudokod är inte riktig kod – den är ett sätt att beskriva vad programmet ska göra, utan att bry sig om exakt syntax. Den ska vara kort, tydlig och lätt att översätta till Python.

Hur skriver man pseudokod för en loop? En vanlig struktur är:

  • Så länge villkor gäller
    • gör något
    • uppdatera variabler

Eller för ett bestämt antal varv:

  • Upprepa antal gånger
    • gör något i varje varv

Du behöver inte använda Python-ord som while eller for. Pseudokoden ska beskriva idén, inte syntaxen.

Exempel: Pseudokod → Python

  • Så länge tal är mindre än eller lika med 5
    • skriv ut tal
    • öka tal med 1

Kodexempel: Pseudokod → Python

tal = 1

while tal <= 5:
    print(tal)
    tal += 1

Pseudokoden förklarar principen. Python-versionen följer samma logik, men använder riktig kod och korrekta indrag.

Exempel: Pseudokod → Python

  • Upprepa 10 gånger
    • Skriv ut varvnummer

Kodexempel: Pseudokod → Python

for i in range(10):
    print("Varv:", i)

Övning 4.2g – Översätt två korta pseudokodsbeskrivningar

Översätt följande två pseudokod till riktiga Python-koder.

Uppgift 1

  • Så länge tal är mindre än 20
    • Skriv ut tal
    • Öka tal med två

Uppgift 2

  • Upprepa för alla tal från 1 till 10
    • skriv ut talet och talets kvadrat

Lösningsförslag

# 1
tal = 0
while tal < 20:
    print(tal)
    tal += 2

# 2
for tal in range(1, 11):
    print(tal, tal * tal)

Övning 4.2h – Beskriv loopen med pseudokod

Skriv pseudokod för följande Python-program:

Programkod

n = int(input("Ange ett tal: "))

for i in range(1, n + 1):
    if i % 3 == 0:
        print(i, "är delbart med 3")

Beskriv vad loopen gör med en enkel punktlista eller några få rader pseudokod.

Förslag

  • Läs in ett tal n
  • För alla tal från 1 till n
    • Om talet är delbart med 3
      • skriv ut talet

Uppgift: m04u06

Denna uppgift kan kännas lite klurig men lös punkt för punkt nedan så går det lättare.

Låt användaren mata in följande tal;

  • Ett tal som loopen skall börja med.
  • Ett tal som loopen skall avsluta med.
  • Ett tal som inte skall skrivas ut.
  • Ett tal som skall avbryta loopen.

Bygg sedan detta program med en while-loop så att det fungerar enligt instruktionerna ovan.

Planera gärna uppgiften med pseudokod.

4.2.4 Vanliga fel i loopar och hur du undviker dem

Loopar är ett av de vanligaste områdena där elever stöter på buggar. I det här avsnittet går vi igenom vanliga misstag och hur du kan felsöka loopar på ett smart sätt.

Vi tittar på körtidsfel (loopen beter sig fel vid körning) och logiska fel (loopen gör något annat än det du tänkt).

4.2.4.1. Oändlig loop (while-loop som aldrig avslutas)

Exempel på fel

tal = 1

while tal < 10:
    print(tal)
    # tal ökas aldrig!

Vad händer?

Villkoret tal < 10 är alltid sant eftersom tal aldrig uppdateras. Programmet fastnar i loopen för alltid.

Korrekt version

tal = 1

while tal < 10:
    print(tal)
    tal += 1

4.2.4.2. continue som låser loopen

Exempel på fel

tal = 0

while tal < 5:
    if tal % 2 == 0:
        continue      # tal ökas aldrig → oändlig loop
    tal += 1

Förklaring: continue hoppar över tal += 1. Loopen kan inte gå vidare.

Korrekt version

tal = 0

while tal < 5:
    tal += 1
    if tal % 2 == 0:
        continue
    print(tal)

4.2.4.3. Loopen körs aldrig (fel villkor)

Exempel på fel

tal = 10

while tal < 5:
    print(tal)
    tal -= 1

Varför körs den inte?

tal < 5 är redan falskt från början, så loopen hoppar över allt.

Tips

Fundera alltid: är mitt villkor sant när loopen startar?

4.2.4.4. Felaktig range i en for-loop

Här händer inga “oändliga loopar”, men felaktig range() gör att loopen kör fel antal varv.

Vanligt misstag

for i in range(10, 1):
    print(i)

Detta skriver inte ut något alls, eftersom Python räknar uppåt som standard (steg = 1) och aldrig når stopvärdet.

Korrekt med negativ steglängd

for i in range(10, 1, -1):
    print(i)

Övning 4.2i – Hitta och rätta buggar i loopar

Korrigera följande program så att det fungerar som tänkt.

Kodexempel: Uppgift 1

tal = 5
while tal > 0:
    if tal == 3:
        continue
    print(tal)
    tal -= 1

Tipset: Vad händer när tal är 3?

Kodexempel: Uppgift 2

x = 1
while x < 10:
    print(x)

Tipset: Varför ökar aldrig x?

Kodexempel: Uppgift 3

for i in range(5, 0):
    print(i)

Tipset: Hur fungerar range när du vill räkna nedåt?

Lösningsförslag

# 1 – continue stoppar loopen vid 3
tal = 5
while tal > 0:
    if tal == 3:
        tal -= 1
        continue
    print(tal)
    tal -= 1

# 2 – glömt uppdatera variabeln
x = 1
while x < 10:
    print(x)
    x += 1

# 3 – range med negativt steg
for i in range(5, 0, -1):
    print(i)

Övning 4.2j – Beskriv varför loopen beter sig fel

För varje kodsnutt: skriv i en eller två meningar vad felet är och varför.

Kodexempel: Uppgift 1

i = 10
while i != 0:
    print(i)

Varför kommer loopen aldrig avslutas?

Kodexempel: Uppgift 2

for i in range(1, 5, -1):
    print(i)

Varför körs den inte alls?

Kodexempel: Uppgift 3

tal = 3
while tal < 10:
    print(tal)
    if tal == 5:
        break

Varför blir det en oändlig loop?

Lösningsförslag

Lösningsförslag: Uppgift 1

i = 10
while i != 0:
    print(i)

Felet är att variabeln i aldrig ändras i loopen. Villkoret i != 0 förblir sant för alltid, vilket gör loopen oändlig.

Lösningsförslag: Uppgift 2

for i in range(1, 5, -1):
    print(i)

range(1, 5, -1) försöker räkna bakåt (negativt steg) men startvärdet 1 är redan mindre än stoppvärdet 5. Serien kan inte skapas, så loopen körs inte alls.

Lösningsförslag: Uppgift 3

tal = 3
while tal < 10:
    print(tal)
    if tal == 5:
        break

Variabeln tal ökas aldrig, så villkoret tal < 10 förblir sant för alltid. Loopen stannar aldrig eftersom tal aldrig når värdet 5.

4.2.5 Felhantering i loopar – try/except

När vi använder try/except för att kontrollera inmatning är det vanligast att lägga konstruktionen inuti en yttre loop. Det gör att programmet kan be användaren försöka igen utan att krascha eller avslutas. Samma kod kan köras utan loop, men då finns ingen möjlighet att göra en ny inmatning automatiskt vid fel.

Tidigare har vi sett att våra program kraschar om användaren matar in något som inte går att omvandla till rätt datatyp, t.ex. om vi gör int(input()) och användaren skriver hej. Detta är ett körtidsfel och det kan stoppas med try/except.

try testar att köra en kodrad. Om allt fungerar fortsätter programmet som vanligt. Om ett fel inträffar hoppar Python direkt till except, där vi kan skriva ut ett meddelande och be användaren försöka igen.

Kodexempel: kräva korrekt heltal

while True:
    try:
        tal = int(input("Ange ett heltal: "))
        break   # bara om inmatningen lyckas
    except:
        print("Fel: du måste mata in ett heltal.")
        
print("Du matade in talet", tal)

Förklaring:

  • try testar att omvandla inmatningen till ett heltal.
  • Om det misslyckas fångas felet av except och loopen fortsätter.
  • När användaren till slut skriver ett giltigt tal avbryts loopen med break.

Varför är detta viktigt?

Om du inte kontrollerar inmatningen kan ditt program krascha. Med try/except kan du istället ta kontroll och se till att användaren alltid matar in giltiga värden innan programmet går vidare.

Övning 4.2k – Robust inmatning

Gör ett program som:

  1. Låter användaren mata in ett heltal mellan 1 och 50.
  2. Använder try/except om användaren skriver något fel.
  3. Upprepar inmatningen tills ett giltigt tal anges.

Lösningsförslag

while True:
    try:
        tal = int(input("Ange ett tal mellan 1 och 50: "))
        
        if 1 <= tal <= 50:
            break     # giltigt värde
        else:
            print("Talet måste vara mellan 1 och 50.")
    
    except:
        print("Fel: du måste mata in ett heltal.")

print(f"Du matade in: {tal}")

Programmet fortsätter tills användaren matar in ett giltigt heltal i rätt intervall. try/except fångar felaktiga datatyper och intervallkontrollen ser till att bara godkända värden accepteras.

Uppgift: m04u07 (svårare)

Bygg vidare på programmet från m04u06. Användaren ska mata in:

  • ett startvärde
  • ett stoppvärde
  • ett tal som ska hoppas över
  • ett tal som ska avbryta loopen

Programmet ska loopa från start till stopp enligt användarens inmatning, men innan loopen startar ska du kontrollera att alla värden är giltiga.

Krav:

  • Använd try/except så att felaktiga inmatningar inte kraschar programmet.
  • Start- och stoppvärde måste vara giltiga i förhållande till steglängden.
    (Om stoppvärdet är mindre än startvärdet måste steglängden vara negativ.)
  • Talen som ska hoppas över eller avbryta loopen måste ligga inom intervallet.

När alla värden är korrekta: kör loopen enligt instruktionerna och skriv ut resultatet.

I detta avsnitt har du lärt dig använda iteration i olika former: for-loopar, while-loopar, nästlade loopar, break, continue och robust inmatning med try/except. Du har tränat både på att skriva kod och på att felsöka loopar. Nu är du redo att arbeta med listor — där iteration är ett av de viktigaste verktygen.

4.3 Listor (list)

Hittills har du mest arbetat med enstaka värden – ett tal, en sträng, en boolesk variabel. Ofta vill man kunna spara många värden som hör ihop, till exempel:

  • alla poäng på ett prov
  • namnen på eleverna i en klass
  • veckans temperaturer

I Python använder vi listor (typen list) för att spara flera värden i samma variabel.

4.3.1 Skapa och läsa listor

En lista skapas med hakparenteser [] och värden separerade med kommatecken.

Kodexempel: skapa några listor

tom_lista = []
tal = [3, 7, 10, 4]
namn = ["Anna", "Bo", "Celine"]
blandat = [10, "hej", True]

En lista kan innehålla olika datatyper, men i den här kursen kommer vi oftast att ha samma typ av data i en lista (t.ex. bara heltal, eller bara strängar).

4.3.1.1 Index – komma åt ett visst element

Varje värde i en lista har ett index – ett positionsnummer. Python börjar räkna från 0:

  • första elementet har index 0
  • andra elementet har index 1
  • osv…

Kodexempel: läsa ur en lista

namn = ["Anna", "Bo", "Celine"]

print(namn[0])   # första namnet
print(namn[1])   # andra namnet
print(namn[2])   # tredje namnet

Utskrift

Anna
Bo
Celine

Du kan också använda negativa index för att räkna baklänges från slutet:

Kodexempel: negativa index

namn = ["Anna", "Bo", "Celine"]

print(namn[-1])   # sista elementet ("Celine")
print(namn[-2])   # näst sista ("Bo")

Utskrift

Celine
Bo

Med funktionen len() får du veta hur många element listan innehåller.

Kodexempel: längden på en lista

namn = ["Anna", "Bo", "Celine"]
antal = len(namn)

print(f"Listan innehåller {antal} namn")

Utskrift

Listan innehåller 3 namn

Övning 4.3a – Träna på index

Givet listan namn = ["Anna", "Bo", "Celine", "David"]:

  1. Skriv ut det första namnet.
  2. Skriv ut det andra namnet.
  3. Skriv ut det näst sista namnet.

Lösningsförslag

namn = ["Anna", "Bo", "Celine", "David"]

print(namn[0])
print(namn[1])
print(namn[-2])

Övning 4.3b – Skapa och läsa listor

I denna övning tränar du samma färdigheter som i 4.3a, men på din egen lista.

  1. Skapa en lista med tre favoritfilmer.
  2. Skriv ut första och sista filmen med hjälp av index.
  3. Skriv ut hur många filmer listan innehåller med len().

Lösningsförslag

filmer = ["Inception", "Shrek", "Spider-Man"]

print(f"Första filmen: {filmer[0]}")
print(f"Sista filmen: {filmer[-1]}")
print(f"Antal filmer: {len(filmer)}")

Fördjupning: slicing av listor

I Python kan du ta ut delar av en lista genom att ange ett intervall: lista[start:stop]. Startindex ingår, stopindex ingår inte. Anges inte startindex eller stopindex så gäller listans ordinarie start/stop.

Kodexempel: slicing av listor

namn = ["Anna", "Bo", "Celine", "David", "Elias"]

print(namn[1:3])    # ['Bo', 'Celine']
print(namn[:2])     # ['Anna', 'Bo']
print(namn[3:])     # ['David', 'Elias']
print(namn[-2:])    # ['David', 'Elias']

Slicing är ett praktiskt sätt att få en delmängd av en lista utan att behöva loopa, men det går också att loopa igenom en slicad lista.

4.3.2 Ändra listor – append, insert, remove, pop

Till skillnad från strängar är listor förändringsbara (eng. mutable). Du kan lägga till, ta bort och ändra element efter att listan skapats.

4.3.2.1 Byta ut ett element

Kodexempel: ändra ett element i listan

namn = ["Anna", "Bo", "Celine"]
namn[1] = "Bertil"    # Byt ut värdet i index 1 (andra elementet)

print(namn)

Utskrift

['Anna', 'Bertil', 'Celine']

4.3.2.2 Lägga till element

  • append(x) – lägger till x sist i listan
  • insert(index, x) – lägger till x på ett visst ställe (och flyttar alla andra element ett steg åt höger)

Kodexempel: lägga till med append och insert

namn = ["Anna", "Bo"]

namn.append("Celine")       # lägg till sist
namn.insert(1, "David")     # lägg in på plats 1
print(namn)

Utskrift

['Anna', 'David', 'Bo', 'Celine']

4.3.2.3 Ta bort element

  • remove(x) – tar bort första förekomsten av värdet x
  • pop() – tar bort och returnerar sista elementet
  • pop(index) – tar bort och returnerar elementet på en viss plats

Kodexempel: ta bort värden

namn = ["Anna", "Bo", "Celine", "Bo", "David"]

namn.remove("Bo")      # tar bort första "Bo"
sist = namn.pop()      # tar bort sista elementet
element2 = namn.pop(1) # tar bort andra elementet (index 1) 

print(f"Listan nu: {namn}")
print(f"Tog bort sist: {sist}")
print(f"Tog bort andra: {element2}")

Utskrift

Listan nu: ['Anna', 'Bo', 'Celine']
Tog bort sist: David
Tog bort andra: Bo
  

Övning 4.3c – Hantera en klasslista

  1. Skapa en lista klass med tre namn.
  2. Lägg till ett fjärde namn sist med append().
  3. Infoga ett nytt namn på plats 1 (index 1) med insert().
  4. Ta bort ett av namnen med remove().
  5. Skriv ut den färdiga listan.

Lösningsförslag

klass = ["Adam", "Bea", "Carl"]

klass.append("Dina")
klass.insert(1, "Elias")
klass.remove("Carl")

print("Aktuell klasslista:", klass)

Fördjupning: sortera listor

Python kan sortera listor automatiskt. Det finns två vanliga sätt:

  • lista.sort() – sorterar listan på plats (listan förändras)
  • sorted(lista) – skapar en ny sorterad lista (originalet ändras inte)

Kodexempel: Sortera listor

tal = [5, 1, 8, 3]

tal.sort()
print("Sorterad lista:", tal)   
# Utskrift: [1, 3, 5, 8]

# sorted() ger en ny lista istället
tal2 = [5, 1, 8, 3]
ny_lista = sorted(tal2)

print("Original:", tal2)
print("Ny sorterad lista:", ny_lista)

Tips: Sortering fungerar för tal och strängar. Vill du sortera i omvänd ordning kan du använda reverse=True:

Kodexempel: omvänd sortering

tal = [5, 1, 8, 3]

ny_lista = sorted(tal, reverse=True)
tal.sort(reverse=True)

print(tal)       # [8, 5, 3, 1]
print(ny_lista)  # [8, 5, 3, 1]

4.3.3 Loopar + listor

Listor blir som mest användbara när du kombinerar dem med for-loopar. I stället för att räkna med range() kan du loopa direkt över listans innehåll.

Kodexempel: loopa över en lista

namn = ["Anna", "Bo", "Celine"]

for person in namn:
    print("Hej", person)

Här får variabeln person värdet av nästa element i listan varje varv, på samma sätt som du tidigare gått igenom en sträng bokstav för bokstav.

Ibland vill man också ha indexet. Då kan man kombinera range() och len():

Kodexempel: loopa genom index

poäng = [12, 18, 15]

for i in range(len(poäng)):        # 0, 1, 2
    print(f"Elev {i} fick {poäng[i]} poäng på provet.")

Utskrift

Elev 0 fick 12 poäng
Elev 1 fick 18 poäng
Elev 2 fick 15 poäng
  

Indexet kan sedan användas för att hämta information i en annan lista, kanske skall vi matcha namn och resultat från provet.

Kodexempel: både index och värde

elever = ["Anna", "Bo", "Celine"]
poäng = [12, 18, 15]

for i in range(len(elever)):        # 0, 1, 2
    print(f"Elev {elever[i]} fick {poäng[i]} poäng på provet.")

Utskrift

Elev 0: Anna fick 12 poäng
Elev 1: Bo fick 18 poäng
Elev 2: Celine fick 15 poäng

4.3.3.1 Ett smartare sätt: enumerate()

I många situationer vill man både ha index och värde när man loopar över en lista. Det går att göra med range(len(lista)), men Python har ett tydligare och säkrare sätt: enumerate().

Den ger både index och värde automatiskt:

Kodexempel: loopa med enumerate()

poäng = [12, 18, 15]

for i, värde in enumerate(poäng):
    print(f"Elev {i} fick {värde} poäng")

Utskrift

Elev 0 fick 12 poäng
Elev 1 fick 18 poäng
Elev 2 fick 15 poäng
  

Kodexempel: både index och värde

elever = ["Anna", "Bo", "Celine"]
poäng = [12, 18, 15]

for i, namn in enumerate(elever):
    print(f"Elev {i}: {namn} fick {poäng[i]} poäng")

Utskrift

Elev 0: Anna fick 12 poäng
Elev 1: Bo fick 18 poäng
Elev 2: Celine fick 15 poäng

Fördelar med enumerate():

  • Koden blir lättare att läsa.
  • Du slipper skriva lista[i].
  • Mindre risk för indexfel.

Du kommer använda enumerate() i flera kommande uppgifter.

Övning 4.3d – Förstå enumerate()

Givet listan frukter = ["äpple", "banan", "kiwi"]:

  1. Skriv ut både index och frukt med hjälp av enumerate().

Lösningsförslag

frukter = ["äpple", "banan", "kiwi"]

for i, frukt in enumerate(frukter):
    print(i, frukt)

4.3.3.2 Summera med en loop

I exemplet nedan beräknas först summan och sedan medelvärdet. Både summan och medelvärdet skrivs ut.

Kodexempel: räkna ut medelvärde

poäng = [12, 18, 15, 20]

summa = 0
for p in poäng:
    summa += p

medel = summa / len(poäng)
print(f"Medelpoäng: {medel}")
print(f"Summa: {summa}")

Utskrift

Medelpoäng: 16.25
Summa: 65
  

Övning 4.3e – Summera värden

Givet listan tal = [3, 5, 8, 2]:

  1. Beräkna summan av alla tal i listan.
  2. Beräkna produkten av alla tal i listan.

Lösningsförslag

tal = [3, 5, 8, 2]

# Summa
summa = 0
for x in tal:
    summa += x

# Produkt
produkt = 1
for x in tal:
    produkt *= x

print("Summa:", summa)
print("Produkt:", produkt)

4.3.3.3 Inbyggda funktioner för listor: sum(), min(), max()

Python har färdiga funktioner som kan användas på listor med tal:

  • sum(lista) – räknar ut summan
  • min(lista) – ger minsta värdet
  • max(lista) – ger största värdet

Dessa fungerar när du vill beräkna något på alla värden i listan. Men ibland räcker de inte – till exempel om du bara vill summera de positiva talen, eller de tal som är större än 10. Då behöver du en egen loop.

Kodexempel

poäng = [12, 18, 15, 20]

print(sum(poäng))
print(min(poäng))
print(max(poäng))

Utskrift

65
12
20
  

Övning 4.3f – Temperaturanalys

Givet följande lista med dygnstemperaturer (grader Celsius):

Kodexempel: temperaturer

temperaturer = [-2, 0, 3, 5, 1, -1, 4]
  1. Beräkna summan av alla temperaturer med en for-loop.
  2. Ta fram minsta och största temperatur (utan att använda min()/max()).
  3. Beräkna medeltemperaturen (summa delat på antal värden).

Lösningsförslag

temperaturer = [-2, 0, 3, 5, 1, -1, 4]

summa = 0
minsta = temperaturer[0]
största = temperaturer[0]

for t in temperaturer:
    summa += t
    if t < minsta:
        minsta = t
    if t > största:
        största = t

medel = summa / len(temperaturer)

print(f"Summan: {summa}")
print(f"Minsta: {minsta}")
print(f"Största: {största}")
print(f"Medeltemperatur: {medel:.2f}")

Utskrift

Summan: 10
Minsta: -2
Största: 5
Medeltemperatur: 1.43
  

Uppgift: m04u08

Introduktion till m04u08

I denna uppgift ska du använda flera av de viktigaste teknikerna med listor: inmatning av värden, loopar, beräkningar och jämförelse med inbyggda funktioner. Uppgiften är uppdelad i två delar för att alla ska kunna lyckas.

Första delen tränar beräkningar på en färdig lista. Andra delen låter användaren bygga listan själv. Den färdiga lösningen ska fungera likadant i båda fallen.

Fyll en lista med heltal tills användaren matar in 0, då stoppas inmatningen. Skriv sedan ut summan av alla tal i listan, leta efter högsta och lägsta talet. Detta ska beräknas! Skriv sedan ut det du har beräknat och jämför med de inbyggda funktionerna sum(), min() och max().

Tycker du att denna uppgift är svår, eller har svårt att komma igång med, så är den uppdelad i två delar nedan. Lösningen ska bli densamma när du är klar.

Första delen

Skapa en lista med 5 heltal. Loopa igenom listan och beräkna summan av alla tal samt ta fram lägsta och högsta värdet. Detta ska beräknas! Skriv sedan ut det du har beräknat och jämför med inbyggda funktioner.

Hjälp [klicka för att visa]

Ett säkert sätt att sätta startvärden för minsta och största är att börja med det första talet i listan:

minsta = tal_lista[0]
största = tal_lista[0]

Då vet du att båda värdena är korrekta från början.

Tips

Det är smart att skriva pseudokod först för att planera din lösning innan du kodar.

Andra delen

Låt nu användaren mata in tal till din lista, ta bort de tal du skapat tidigare, tills användaren matar in talet 0. Då är användaren klar med inmatningen. Se till att alla beräkningar från första delen fortfarande fungerar.

Hjälp [klicka för att visa]

Skapa en while-loop som avbryts när användaren matar in talet 0. Kom ihåg att värdet inte ska lagras i listan.

4.3.4 Söka i listor – in och for/else

Ofta vill man veta om ett visst värde finns i en lista, till exempel om ett namn finns i en klasslista. Python har en enkel operator för detta: in.

Kodexempel: kontrollera om ett namn finns

klass = ["Anna", "Bo", "Celine"]

namn = input("Ange ett namn: ")

if namn in klass:
    print(f"{namn} finns i listan.")
else:
    print(f"{namn} hittades inte.")

Du kan också söka “manuellt” med en loop. I Python finns ett praktiskt mönster där man använder for-loop tillsammans med else för att skilja på hittat och inte hittat.

4.3.3.2 for/else – vad betyder else efter en loop?

I Python kan en for-loop (och även while) ha ett eget else-block. Det fungerar inte som else i en if-sats, utan har en egen betydelse:

else-blocket körs endast om loopen inte avbrutits med break.

  • Om loopen hittar det du söker och använder breakelse körs inte.
  • Om loopen går klart utan att hitta något → else körs.

Detta gör for/else mycket användbart vid sökningar, eftersom du kan skilja på “hittat” och “inte hittat” utan extra variabler.

Kodexempel: sökning med for/else

klass = ["Anna", "Bo", "Celine"]
namn = input("Ange ett namn: ")

for elev in klass:
    if elev == namn:
        print("Hittade", namn)
        break
else:
    # else körs bara om loopen INTE bröts med break
    print(namn, "fanns inte i listan.")

for/else – när används det?

for/else används framför allt vid sökningar, när du vill skilja på “hittade något” (loopen bryts med break) och “inget hittades” (loopen går klart).

Övning 4.3g - Sök efter ett namn i en lista

Du ska skriva ett litet program för att söka efter ett namn i en lista.

  1. Skapa en lista klass med minst fem namn.
  2. Låt användaren skriva in ett namn att söka efter.
  3. Om namnet finns i listan, skriv exempelvis Namnet finns i listan.
  4. Annars skriv Namnet hittades inte.

Tips: Lös först uppgiften med if namn in klass. Om du vill utmana dig själv kan du även lösa den med for/else.

Lösningsförslag — enkel version (med in)

klass = ["Anna", "Bo", "Celine", "David", "Elias"]

namn = input("Ange ett namn att söka efter: ")

if namn in klass:
    print(f"{namn} finns i listan.")
else:
    print(f"{namn} hittades inte.")
  

Lösningsförslag — avancerad version (med for/else)

klass = ["Anna", "Bo", "Celine", "David", "Elias"]

namn = input("Ange ett namn att söka efter: ")

for elev in klass:
    if elev == namn:
        print(f"{namn} finns i listan.")
        break
else:
    print(f"{namn} hittades inte.")
  

4.3.5 Slump och listor

Listor används ofta tillsammans med slumptal, till exempel vid simuleringar, spel, statistik eller sannolikhetsproblem. Python har en inbyggd modul, random, som gör det enkelt att skapa slumptal.

Kodexempel: slumpa heltal

from random import randint

# Skriv ut ett slumpat tal mellan 1 och 100
print(f"Slumpat tal mellan 1 och 100: {randint(1, 100)}")

Vi kan använda randint() för att skapa listor med slumpade tal – till exempel provresultat, tärningskast eller simuleringar.

Kodexempel: fyll en lista med slumptal

from random import randint

slumpade_tal = []

for _ in range(10):
    slumpade_tal.append(randint(1, 6))

print(slumpade_tal)

I koden ovan använder vi _ som loopvariabel när värdet inte behövs.

Övning 4.3h – Skapa en lista med slumptal

  1. Fråga användaren hur många slumptal som ska genereras.
  2. Skapa en lista med så många slumptal mellan 1 och 20.
  3. Skriv ut listan.
  4. Skriv ut hur många av talen som var större än 10.

Lösningsförslag

from random import randint

antal = int(input("Hur många slumptal vill du skapa? "))

tal_lista = []
for _ in range(antal):
    tal_lista.append(randint(1, 20))

print(f"Listan: {tal_lista}")

större_än_tio = 0
for tal in tal_lista:
    if tal > 10:
        större_än_tio += 1

print(f"Antal tal större än 10: {större_än_tio}")

Exempel på möjlig utskrift

Listan: [3, 17, 12, 5, 19]
Antal tal större än 10: 3
  

Övning 4.3i – Räkna förekomster

I denna övning tränar du på att räkna hur många gånger ett värde förekommer i en lista.

  1. Skapa en lista med 20 slumptal mellan 1 och 5.
  2. Räkna hur många gånger varje tal (1–5) förekommer.
  3. Skriv ut resultatet på ett snyggt sätt.

Lösningsförslag

from random import randint

slumptal = []
for _ in range(20):
    slumptal.append(randint(1, 5))

print("Listan:", slumptal)

räkning = [0, 0, 0, 0, 0]   # index 0 svarar för talet 1 osv

for tal in slumptal:
    räkning[tal - 1] += 1

for i, antal in enumerate(räkning, start=1):
    print(f"Antal {i}: {antal}")

Exempel på möjlig utskrift

Listan: [2, 5, 1, 3, 3, 1, 4, 2, 5, 5, 1, 4, 2, 5, 3, 3, 1, 2, 4, 5]
Antal 1: 4
Antal 2: 4
Antal 3: 4
Antal 4: 4
Antal 5: 4

4.3.3.4 Ett enklare sätt att räkna förekomster: list.count(x)

I förra övningen räknade du själv hur många gånger varje värde förekom i listan. Det är bra träning, men Python har också en färdig funktion som kan räkna åt dig:

lista.count(x) – returnerar hur många gånger värdet x förekommer i listan.

Kodexempel: räkna förekomster med count()

tal = [1, 2, 3, 2, 2, 4]

print(tal.count(2))   # hur många tvåor finns det?
print(tal.count(5))   # hur många femmor?
  

Utskrift

3
0
  

Detta är ett mycket enkelt och effektivt sätt att kontrollera ett värdes förekomst i en lista. I större projekt kommer du ofta använda count() för snabba kontroller, men det är viktigt att du förstår hur du själv kan räkna med loopar, vilket du tränade i 4.3i.

Övning 4.3j – bygg in count() i övning 4.3i

Gå tillbaka till din lösning från Övning 4.3i, där du själv räknade hur många gånger värdena 1–5 förekom i listan.
Lägg nu till kod som använder lista.count(x) för att räkna samma sak.

Dina mål:

  • Räkna värdena med din egen loop (som tidigare).
  • Räkna samma värden med count().
  • Jämför resultaten – de ska vara identiska.

Tips [klicka för att visa]

Du kan till exempel skriva:

for i in range(1, 6):
    print("Egen räkning:", räkning[i-1])
    print("Med count():", slumptal.count(i))
      

Nu har du två olika verktyg: ett manuellt (loopar) och ett automatiskt (count()). Båda är viktiga — i olika situationer.

Uppgift: m04u09

Äntligen dags att ta fram tärningen och göra en simulering! Fråga användaren hur många tärningsslag hen vill göra. Vi använder en vanlig tärning med värden 1–6.

Simulera sedan slagen och lagra dem i en lista. Skriv därefter ut hur många gånger varje tärningsvärde förekom. Presentera resultatet på ett snyggt och tydligt sätt.

Kodexempel: slumpa tärningskast

from random import randint

# Slumpa ett tärningskast
kast = randint(1, 6)
print("Du slog:", kast)

Tips

  • Skapa en lista med alla tärningsslag.
  • Skapa sedan en separat lista eller variabler för att räkna förekomsten av varje tärningsvärde.
  • Du kan använda enumerate() för att skriva ut resultatet snyggt.

4.3.6 Listor i listor (listor av rader och kolumner)

En lista kan också innehålla andra listor. Det är ett vanligt sätt att representera tabeller, spelplaner eller matriser.

Kodexempel: enkel tabell med listor i listor

tabell = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

print(tabell[0][0])   # första raden, första kolumnen → 1
print(tabell[1][2])   # andra raden, tredje kolumnen → 6

För att skriva ut hela tabellen kan du använda en nästlad loop, precis som i avsnittet om nästlade iterationer.

Kodexempel: skriva ut en tabell

tabell = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

for rad in tabell:
    for värde in rad:
        print(värde, end=" ")
    print()      # radbrytning efter varje rad

Övning 4.3k – Poängtabell

En klass har tre elever som gjort två prov var. Skapa en lista med listor där varje rad innehåller [namn, poäng_prov1, poäng_prov2].

  1. Skriv ut alla rader på ett snyggt sätt.
  2. Räkna ut och skriv ut totalpoängen för varje elev.

Lösningsförslag

elever = [
    ["Anna", 15, 18],
    ["Bo", 12, 14],
    ["Celine", 20, 19]
]

for elev in elever:
    namn = elev[0]
    total = elev[1] + elev[2]
    print(f"{namn} fick totalt {total} poäng")

Uppgift: m04u10

Denna uppgift sammanfattar allt du lärt dig om listtypen list Uppgiften testar inmatning, loopar, sökning, sortering och listor i listor.

Arbeta steg för steg. Varje del bygger vidare på föregående.

Del A – Bygg en klasslista

  • Skapa en tom lista klass.
  • Låt användaren mata in namn.
  • Varje namn ska läggas in i listan.
  • När användaren skriver STOP avslutas inmatningen.

När listan är klar ska du:

  • Skriva ut hela listan.
  • Skriva ut hur många namn listan innehåller.

Del B – Sök i listan

  • Fråga användaren efter ett namn att söka efter.
  • Om namnet finns i listan, skriv ut att det hittades.
  • Om namnet inte finns, fråga om användaren vill lägga till det.
  • Om ja – lägg till namnet i listan.

Del C – Sortera och skriv ut snyggt

  • Sortera listan i bokstavsordning.
  • Skriv ut listan numrerad, en person per rad.
  • Använd enumerate().

Del D – Listor i listor

  • Skapa en ny lista som innehåller par av namn.
  • Varje inre lista ska innehålla två namn.
  • Om listan har udda antal namn ska sista paret innehålla "-" som plats två.
  • Skriv ut alla par.

Extra utmaning (frivillig)

  • Skriv ut de tre första namnen efter sortering.
  • Låt användaren ta bort ett namn ur listan.
  • Skriv ut listan baklänges.

4.4 Set (set)

Ibland vill vi samla värden utan att få dubbletter. Till exempel:

  • vilka elever som har lämnat in (unika namn)
  • vilka ord som förekommer i en text (unika ord)
  • vilka tärningsvärden som kom upp (1–6 utan dubbletter)

Då passar datatypen set.

Vad är ett set?

  • Ett set innehåller unika värden (inga dubbletter).
  • Ordningen är inte viktig (och kan variera).
  • Du kan inte hämta värden med index, eftersom set saknar index. Ett set är optimerat för snabba kontroller av om något finns, inte för ordning eller position.

4.4.1 Skapa set

Du kan skapa set på två vanliga sätt:

  • med { } när du redan har värden
  • med set(lista) när du vill ta bort dubbletter från en lista

Kodexempel: skapa set

# 1) Skapa set direkt
frukter = {"äpple", "banan", "kiwi"}
print(frukter)                      # {'kiwi', 'äpple', 'banan'}

# 2) Skapa set från en lista (tar bort dubbletter)
tal = [1, 2, 3, 3, 4, 3, 2]
unika_tal = set(tal)

print("Original lista:", tal)       # Original lista: [1, 2, 3, 3, 4, 3, 2]
print("Unika tal:", unika_tal)      # Unika tal: {1, 2, 3, 4}

Tips

  • Om du behöver en sorterad utskrift kan du använda sorted() på ett set.
  • Exempel: print(sorted(unika_tal))

4.4.2 Lägga till och ta bort

Tre vanliga metoder är:

  • add(x) – lägger till ett värde
  • remove(x) – tar bort ett värde och ger fel om värdet saknas. Används när programmet förväntar sig att värdet ska finnas.
  • discard(x) - ger inget fel om värdet saknas och används när det är okej att värdet kanske inte finns.

Kodexempel: add, remove och discard

namn = {"Anna", "Bo"}

namn.add("Celine")
print(namn)           # {'Bo', 'Anna', 'Celine'}

namn.remove("Bo")
print(namn)           # {'Anna', 'Celine'}

namn.discard("Bo")    # Tar bort Bo om det finns, inga error.
print(namn)           # {'Anna', 'Celine'}

4.4.3 Loopar + set

Du kan loopa igenom ett set precis som en lista, men kom ihåg att ordningen inte är garanterad.

Kodexempel: loopa igenom set

unika = {3, 7, 2, 7, 3}

for tal in unika:
    print(tal)

När du kör koden ovan blir utskriften:

Utskrift

2
3
7

Nu har vi kikat på flera olika exempel och vi har sagt att set inte sorteras. Men känslan är att ett set som innehåller tal ofta är sorterade. Att ett set av tal ser sorterat ut är bara en bieffekt av hur Python råkar lagra talen i minnet, vi kan dock inte garantera att de alltid är sorterade.

Kodexempel: loopa igenom set som är sorterat

namn = {"Anna", "Celine", "Bosse", "Anna", "David"}
print(namn)

for n in sorted(namn):
    print(n)

När du kör koden ovan blir utskriften:

Utskrift

{'Anna', 'David', 'Bosse', 'Celine'}
Anna
Bosse
Celine
David

Övning 4.4a – Unika värden

Skapa en lista med dubbletter och gör sedan ett set av listan.

  1. Skapa listan tal = [1, 2, 2, 3, 3, 3, 4].
  2. Skapa ett set från listan.
  3. Skriv ut hur många unika tal som finns.

Lösningsförslag

tal = [1, 2, 2, 3, 3, 3, 4]
unika = set(tal)

print("Unika tal:", unika)
print("Antal unika:", len(unika))

Övning 4.4b – Unika namn (inmatning)

Skapa ett program som läser in namn tills användaren skriver stop.

  1. Skapa ett tomt set: unika_namn = set().
  2. Läs in namn i en loop.
  3. Om användaren skriver stop ska programmet avslutas.
  4. Lägg annars till namnet i setet.
  5. Skriv till sist ut alla unika namn och hur många de är.

Lösningsförslag

unika_namn = set()

while True:
    namn = input("Skriv ett namn (stop för att avsluta): ")

    if namn == "stop":
        break

    unika_namn.add(namn)

print("Unika namn:", unika_namn)
print("Antal unika namn:", len(unika_namn))

4.5 Tuple (tuple)

En tuple liknar en lista, men med en avgörande skillnad: innehållet kan inte ändras efter att den skapats.

Tuple används när flera värden hör ihop och ska behandlas som ett fast paket, till exempel:

  • koordinater (x, y)
  • fasta inställningar
  • poster som representerar en rad data

Varför använda tuple?

  • tuple signalerar att datan inte ska ändras.
  • Det minskar risken för buggar jämfört med listor.
  • Tuple är något snabbare och använder mindre minne än listor, men i denna kurs är det främst avsikten som är viktig.

Jämförelse: list kan ändras (append, remove), medan tuple inte kan ändras alls.

4.5.1 Skapa tuples

En tuple skapas med parenteser () eller genom att skriva värden separerade med kommatecken.

Kodexempel: skapa tuple

# Med parenteser
punkt = (3, 7)

# Utan parenteser
färg = "röd", "grön", "blå"

print(punkt)              # (3, 7)
print(färg)               # ('röd', 'grön', 'blå')

4.5.1.1 Tuple med ett värde (komma)

När du skapar en tuple med ett enda värde finns det en vanlig fälla som är viktig att känna till.

Det är kommat, inte parenteserna, som gör att Python tolkar värdet som en tuple.

Kodexempel: ett värde – tuple eller inte?

t1 = (5)
t2 = (5,)

print(type(t1))  # <class 'int'>
print(type(t2))  # <class 'tuple'>

I exemplet ovan är t1 inte en tuple, utan bara talet 5. För att skapa en tuple med ett enda värde måste du skriva ett komma.

Kodexempel: fler exempel

en_tuppel = ("hej",)
en_till = (True,)

print(en_tuppel)
print(en_till)

Detta är extra viktigt när du:

  • skapar tuple-värden dynamiskt
  • arbetar med unpacking (kommer i 4.5.4)
  • skickar tuple-värden vidare i programmet

Övning 4.5a – Tuple med ett värde

Testa att skapa tuple med ett enda värde och se skillnaden.

  1. Skapa en variabel a som innehåller (10).
  2. Skapa en variabel b som innehåller (10,).
  3. Skriv ut type(a) och type(b).
  4. Förklara med egna ord varför resultaten skiljer sig.

Lösningsförslag

a = (10)
b = (10,)

print(type(a))
print(type(b))

4.5.2 Läsa värden ur tuple

Precis som listor använder tuple index.

Kodexempel: index i tuple

punkt = (3, 7)

print(punkt[0])   # 3 (x-koordinat)
print(punkt[1])   # 7 (y-koordinat)

Men du kan inte ändra värden:

Kodexempel: otillåten ändring

punkt = (3, 7)

# Detta ger fel:
# punkt[0] = 10
# Felkoden blir: TypeError: 'tuple' object does not support item assignment

4.5.3 Tuple – användbara funktioner

En tuple fungerar ungefär som en lista, men den är oföränderlig. Det betyder att du inte kan lägga till, ta bort eller ändra värden i en tuple.

Tuple har färre funktioner än list, eftersom den är tänkt att vara ett fast paket, men det finns två som är särskilt användbara:

  • count(x) – räknar hur många gånger ett värde förekommer
  • index(x) – ger index (position) för första förekomsten

Kodexempel: count() och index()

weekdays = ("måndag", "tisdag", "onsdag", "torsdag", "fredag", "lördag", "söndag")

# count(): hur många gånger finns ett värde?
print(weekdays.count("tisdag"))  # 1

# index(): vilket index har värdet (första förekomsten)?
print(weekdays.index("torsdag"))  # 3

Kodexempel: index() ger fel om värdet saknas

weekdays = ("måndag", "tisdag", "onsdag")

# Detta ger ett fel om värdet inte finns:
# print(weekdays.index("fredag"))  # ValueError

Om du vill undvika att programmet kraschar kan du först kontrollera om värdet finns i tuplen med in:

Kodexempel: kontrollera med in innan index()

weekdays = ("måndag", "tisdag", "onsdag")

sok = input("Vilken dag söker du? ")

if sok in weekdays:
    print("Index:", weekdays.index(sok))
else:
    print("Dagen finns inte i tuplen.")

Övning 4.5b – count() och index()

Träna på att använda tuple-funktionerna count() och index().

  1. Skapa en tuple som innehåller minst 6 värden, där minst ett värde finns flera gånger.
  2. Skriv ut hur många gånger ett visst värde förekommer med count().
  3. Skriv ut index för ett värde med index().
  4. Testa att använda index() på ett värde som inte finns. Vad händer?

Lösningsförslag

farger = ("röd", "blå", "grön", "blå", "gul", "blå")

print("Antal blå:", farger.count("blå"))
print("Första blå har index:", farger.index("blå"))

# Testa detta (ger fel):
# print(farger.index("svart"))

4.5.4 Tuple unpacking

Ett vanligt och mycket praktiskt sätt att använda tuple är unpacking.

Kodexempel: unpacking

punkt = (3, 7)

x, y = punkt

print("x =", x)     # x = 3
print("y =", y)     # y = 7

Detta används ofta tillsammans med funktioner (kommer i senare moment) som returnerar flera värden.

Övning 4.5c – Koordinater

Skapa en tuple som representerar en punkt i ett koordinatsystem.

  1. Skapa tuple punkt = (5, 9).
  2. Skriv ut x- och y-värdet var för sig.
  3. Använd unpacking.

Lösningsförslag

punkt = (5, 9)

x, y = punkt

print("x =", x)
print("y =", y)

4.5.5 Loopar + tuple

Du kan loopa över en tuple på samma sätt som en lista.

Kodexempel: loopa över tuple

färger = ("röd", "grön", "blå")

for färg in färger:
    print(färg)

Övning 4.5d – Oföränderliga värden

Skapa en tuple med tre temperaturer.

  1. Skapa temperaturer = (18, 21, 19).
  2. Loopa igenom och skriv ut varje värde.
  3. Fundera: varför passar tuple bra här?

Lösningsförslag

temperaturer = (18, 21, 19)

for t in temperaturer:
    print(t)

Övning 4.5e – Välj rätt datastruktur

I denna mikroövning tränar du på att välja rätt datastruktur. Svara med: list, set eller tuple.

  1. Du vill lagra veckodagar i ordning (måndag → söndag).
  2. Du vill ta fram vilka unika bokstäver som finns i ordet "programmering".
  3. Du vill lagra en punkt i ett koordinatsystem: (x, y).
  4. Du vill samla in namn från användaren men vill bara spara varje namn en gång.
  5. Du vill lagra en topplista där placering (1:a, 2:a, 3:a ...) är viktig.

Tips

  • list passar när ordning och position är viktig.
  • set passar när du vill slippa dubbletter.
  • tuple passar när värden hör ihop och inte ska ändras.

Lösningsförslag

  1. list.
    Motivering: Veckodagar har en tydlig ordning, och du vill kunna komma åt t.ex. första dagen och sista dagen.
  2. set
    Motivering: Du vill ha unika bokstäver (inga dubbletter). Ordningen spelar ingen roll, utan det viktiga är vilka bokstäver som finns.
  3. tuple
    Motivering: En punkt (x, y) är ett fast par värden som hör ihop. Tuple signalerar att punkten inte ska ändras av misstag.
  4. set
    Motivering: Du vill spara varje namn max en gång. Set tar automatiskt bort dubbletter när du lägger till samma namn igen.
  5. list
    Motivering: I en topplista är ordningen/placeringen själva poängen. Du behöver kunna sortera, ändra och indexera listan.

Uppgift: m04u11

Syftet är att kontrollera att du kan använda listor, set och tuple i samma program.

Del A – Samla in data

  1. Låt användaren mata in heltal.
  2. Varje tal ska lagras i en lista.
  3. Inmatningen avslutas när användaren matar in 0.
  4. Värdet 0 ska inte sparas i listan.

Del B – Bearbeta data

  1. Skapa ett set av listan för att ta fram alla unika värden.
  2. Skapa en tuple som innehåller:
    • summan av talen
    • minsta talet
    • största talet

Del C – Presentera resultatet

  1. Skriv ut alla inmatade tal.
  2. Skriv ut de unika talen.
  3. Skriv ut summan, minsta och största talet.

Tips

  • Använd while-loop för inmatningen.
  • Använd set() för att ta fram unika värden.
  • Använd sum(), min() och max().
  • Packa resultaten i en tuple.
  • Om listan är tom (om användaren skriver 0 direkt) behöver du hantera det.

4.6 Dictionaries (dict)

Hittills har du oftast sparat data som en lista. I en lista hittar du värden med index (platsnummer). Men ibland vill du istället kunna slå upp ett värde med ett namn eller en nyckel.

Ett dictionary (typen dict) fungerar som en uppslagstabell:

  • nyckelvärde
  • Nycklar är unika (du kan inte ha samma nyckel två gånger).
  • Du hittar värden genom att skriva dict[nyckel] (istället för lista[index]).

Tänk på ett dictionary som en telefonbok eller ett elevregister: du letar inte på “plats 3”, du letar på ett namn.

Kodexempel: index vs nyckel

# Lista: värden hör ihop genom sin position
farger = ["röd", "grön", "blå"]
koder = ["#ff0000","#00ff00", "#0000ff"]

print(farger[0], koder[0])  # röd #ff0000
print(farger[2], koder[2])  # blå #0000ff


# Dictionary: värden hör ihop genom en nyckel
fargkoder = {
  "röd": "#ff0000",
  "grön": "#00ff00",
  "blå": "#0000ff"
}

print(fargkoder["röd"])   # #ff0000
print(fargkoder["blå"])  # #0000ff

I exemplet ovan är nycklarna färgens namn och värdena är färgkoden som bl.a. används vid webbutveckling. Det gör att vi kan slå upp en färgkod direkt, utan att veta vilket index färgen har.

Viktigt: { } betyder inte alltid samma sak

tom_dict = {}      # detta är en tom dict

# Ett tomt set skapas med set()
tomt_set = set()

dict_one = {"Anna":12}      # Ett index och värde i
set_one = {"Anna"}          # Ett värde i set

Övning 4.6a – Skapa en prislista

Skapa ett dictionary som fungerar som en enkel prislista.

  1. Skapa ett dictionary som heter prislista.
  2. Lägg in minst tre varor som nycklar och priser som värden.
  3. Skriv ut priset för en av varorna genom att använda nyckeln.

Lösningsförslag

prislista = {
    "mjölk": 18,
    "bröd": 25,
    "banan": 4
}

print("Bröd kostar:", prislista["bröd"], "kr")

Övning 4.6b – Elev → poäng

Skapa ett dictionary där nycklarna är elevnamn och värdena är provpoäng.

  1. Skapa ett dictionary som heter poang.
  2. Lägg in tre elever och deras poäng.
  3. Skriv ut poängen för en av eleverna.
  4. Testa att skriva ut en elev som inte finns. Vad händer?

Lösningsförslag

poang = {
    "Anna": 15,
    "Bo": 18,
    "Celine": 20
}

print("Bo fick:", poang["Bo"], "poäng")

# Om du försöker med en nyckel som inte finns:
# print(poang["David"])  # ger fel (KeyError)

4.6.1 Skapa, läsa och ändra värden

Ett dictionary kan både skapas, läsas och ändras efteråt. Du kan alltså lägga till nya nycklar, uppdatera värden och ta reda på om en nyckel finns.

  • dict[nyckel] – läs ett värde (om nyckeln finns)
  • dict[nyckel] = värde – lägg till ny nyckel eller ändra befintlig
  • nyckel in dict – kontrollera om nyckeln finns

Kodexempel: läsa, ändra och lägga till värden

huvudstäder = {
  "Sverige": "Stockholm",
  "Norge": "Oslo"
}

# Läs ett värde
print("Sveriges huvudstad är:", huvudstäder["Sverige"])

# Ändra ett värde
huvudstäder["Norge"] = "Bergen"
print("Norges huvudstad är nu:", huvudstäder["Norge"])

# Lägg till en ny nyckel
huvudstäder["Danmark"] = "Köpenhamn"

print(huvudstäder)    # {'Sverige': 'Stockholm', 'Norge': 'Bergen', 'Danmark': 'Köpenhamn'}

När du skriver huvudstäder["Norge"] = "Bergen" så spelar det ingen roll om nyckeln redan finns:

  • Om nyckeln finns → värdet uppdateras.
  • Om nyckeln inte finns → en ny post läggs till.

Kodexempel: kontrollera om en nyckel finns (undvik KeyError)

huvudstäder = {
  "Sverige": "Stockholm",
  "Norge": "Oslo",
  "Danmark": "Köpenhamn"
}

land = input("Ange ett land: ")

if land in huvudstäder:
    print(f"{land}s huvudstad är {huvudstäder[land]}")
else:
    print("Landet finns inte i listan.")

I koden ovan använder vi in för att undvika att programmet kraschar. Om du försöker läsa en nyckel som inte finns får du annars felet KeyError.

Övning 4.6c – Uppdatera och slå upp värden i ett dictionary

I denna övning ska du arbeta med ett dictionary och träna på att lägga till, uppdatera och slå upp värden på ett säkert sätt.

Del A – Skapa och uppdatera

  1. Skapa ett dictionary som heter kurser med tre kurser och deras poäng.
  2. Låt användaren mata in:
    • en kurs (nyckel)
    • ett poängvärde
  3. Lägg till eller uppdatera kursen i dictionaryt.
  4. Skriv ut hela dictionaryt.

Del B – Slå upp värden

  1. Fråga användaren efter en kurs.
  2. Om kursen finns i dictionaryt: skriv ut poängen.
  3. Om kursen inte finns: skriv ut ett tydligt meddelande.

Lösningsförslag

kurser = {
    "Matematik": 100,
    "Svenska": 100,
    "Engelska": 100
}

# Del A: uppdatera eller lägga till
kurs = input("Ange kurs: ")
poang = int(input("Ange poäng: "))

kurser[kurs] = poang

print("\nAlla kurser:")
print(kurser)       # {'Matematik': 100, 'Svenska': 100, 'Engelska': 100, 'Programmering': 100}

# Del B: slå upp kurs
sok = input("\nVilken kurs vill du slå upp? ")

if sok in kurser:
    print(f"{sok} har {kurser[sok]} poäng")
else:
    print("Kursen finns inte i listan.")

Uppgift: m04u12 – Enkel telefonbok

Du ska bygga en enkel telefonbok med dictionary. Uppgiften består av flera delar och tränar både inmatning, kontroller och uppslagning.

Del A – Skapa telefonboken

  1. Skapa ett tomt dictionary: telefonbok = {}.
  2. Låt användaren mata in ett namn.
  3. Om användaren skriver stop ska inmatningen avslutas.
  4. Annars ska användaren mata in ett telefonnummer.
  5. Lägg in namnet och numret i dictionaryt.

Del B – Kontroller

  1. Om namnet redan finns i telefonboken:
    • skriv ut att namnet redan finns
    • fråga om numret ska uppdateras (ja/nej)
  2. Uppdatera numret endast om användaren svarar ja.

Del C – Slå upp nummer

  1. När inmatningen är klar ska hela telefonboken skrivas ut.
  2. Fråga sedan användaren efter ett namn.
  3. Om namnet finns: skriv ut telefonnumret.
  4. Om namnet inte finns: skriv ut ett tydligt meddelande.

Tips

Du kommer att behöva:

  • while True och break
  • if namn in telefonbok
  • flera input()-anrop

4.6.2 Loopar + dictionary

Ett dictionary används väldigt ofta tillsammans med loopar. Till skillnad från listor finns det inga index, men istället kan du loopa över:

  • nycklar
  • värden
  • nyckel + värde samtidigt

Vilket du väljer beror på vad du behöver göra i loopen.

Kodexempel: loopa över nycklar

kontakter = {
    "Anna": "anna@gmail.com",
    "Bo": "bo@hotmail.com",
    "Celine": "celine@skola.se"
}

for namn in kontakter:
    print(namn)

Utskrift

Anna
Bo
Celine

När du loopar direkt över ett dictionary får loopvariabeln nycklarna.

Kodexempel: loopa över värden

for email in kontakter.values():
    print(email)

Utskrift

anna@gmail.com
bo@hotmail.com
celine@skola.se

Här används values() för att bara få fram värdena.

Kodexempel: loopa över nyckel + värde

for namn, email in kontakter.items():
    print(namn, "har e-postadressen", email)

Utskrift

Anna har e-postadressen anna@gmail.com
Bo har e-postadressen bo@hotmail.com
Celine har e-postadressen celine@skola.se

Metoden items() ger både nyckel och värde samtidigt. Det är det vanligaste sättet att skriva ut innehållet i ett dictionary.

Övning 4.6e – Skriv ut ett poängregister

Du ska träna på att loopa över ett dictionary på olika sätt.

  1. Skapa ett dictionary med minst tre elever och deras poäng.
  2. Loopa över dictionaryt och skriv ut alla namn.
  3. Loopa över dictionaryt och skriv ut alla poäng.
  4. Loopa över dictionaryt och skriv ut namn + poäng.

Lösningsförslag

poang = { "Anna": 15, "Bo": 18, "Celine": 20 } 
print("Namn:")

for namn in poang:
    print(namn) 

print("\nPoäng:") 
for p in poang.values(): 
    print(p) 
    
print("\nNamn och poäng:") 
for namn, p in poang.items():
    print(namn, ":", p)

Uppgift m04u13 – Provresultat över medel

Du ska skapa ett program som läser in provresultat och analyserar dem med hjälp av ett dictionary. Varje person ska lagras som namn → resultat.

Krav

  1. Skapa ett tomt dictionary som heter resultat.
  2. Låt användaren mata in ett namn i en loop.
  3. Om användaren skriver tomt namn (bara trycker Enter) ska inmatningen avslutas.
  4. Annars ska användaren mata in provresultat (ett heltal) och detta ska lagras i dictionaryt.
  5. Beräkna summan av alla provresultat.
  6. Beräkna medelvärdet av alla provresultat.
  7. Skriv ut summan och medelvärdet.
  8. Lista sedan alla personer som har ett resultat som är större än medelvärdet.
  9. Avsluta med att skriva hur många personer som ligger över medelvärdet.

Viktigt

  • Du behöver använda loopar över dictionaryt (t.ex. values() och items()).
  • Eftersom vi inte använder funktioner för att “räkna ut allt åt oss” kan det vara naturligt att loopa över dictionaryt mer än en gång.

Tips (om du kör fast)

  • Du kan räkna antal personer på två sätt:
    • Antal poster: len(resultat)
    • Eller: skapa en variabel antal och öka den i samma loop som du summerar
  • Medelvärde kan räknas ut så här: medel = summa / antal
  • För att skriva ut personer som ligger över medel är items() ofta enklast.

Exempel (en möjlig körning)

Exempel på inmatning/utskrift

Namn (Enter för att avsluta): Anna
Resultat: 15
Namn (Enter för att avsluta): Bo
Resultat: 18
Namn (Enter för att avsluta): Celine
Resultat: 20
Namn (Enter för att avsluta):
 
Summa: 53
Medel: 17.67
 
Över medel:
Bo - 18
Celine - 20
 
Antal över medel: 2

Valfri utmaning

  1. Om ett namn redan finns i dictionaryt: fråga om användaren vill skriva över resultatet eller hoppa över.
  2. Skriv ut även den person som har högst resultat.

4.6.3 Räkna förekomster med dictionary

Ett mycket vanligt användningsområde för dictionary är att räkna hur ofta något förekommer. Det kan till exempel vara:

  • betyg
  • ord
  • svarsalternativ

Mönstret är alltid detsamma:

  • om nyckeln redan finns → öka värdet
  • om nyckeln inte finns → skapa den med startvärde 1

Kodexempel: räkna betyg

betyg = ["A", "C", "B", "A", "C", "A"]

antal = {}

for b in betyg:
    if b in antal:
        antal[b] += 1
    else:
        antal[b] = 1

print(antal)

Utskrift

{'A': 3, 'C': 2, 'B': 1}

I exemplet ovan är:

  • nyckeln = betyget
  • värdet = hur många gånger betyget förekommer

Övning 4.6g – Räkna svar

Du ska räkna hur många gånger varje svarsalternativ förekommer.

  1. Skapa en lista med svar, t.ex. ["ja", "nej", "ja", "vet ej", "ja"].
  2. Skapa ett tomt dictionary.
  3. Loopa igenom listan och räkna förekomsterna med hjälp av dictionary.
  4. Skriv ut resultatet.

Lösningsförslag

svar = ["ja", "nej", "ja", "vet ej", "ja"]

antal = {}

for s in svar:
    if s in antal:
        antal[s] += 1
    else:
        antal[s] = 1

print(antal)

Vanlig fallgrop

Ett vanligt fel är att försöka öka ett värde innan nyckeln finns i dictionaryt. Då får du ett fel (KeyError).

4.6.4 Dictionary som register

Ett annat vanligt användningsområde för dictionary är att använda det som ett register: du slår upp en nyckel och får tillbaka ett värde.

  • nyckel → t.ex. ett användarnamn
  • värde → t.ex. ett namn, ett telefonnummer eller en klass

Kodexempel: enkel telefonbok

telefonbok = {
    "Anna": "070-111 22 33",
    "Bo": "070-444 55 66",
    "Celine": "070-777 88 99"
}

print(telefonbok["Anna"])      # slår upp värdet via nyckeln

Utskrift

070-111 22 33

Om du försöker slå upp en nyckel som inte finns får du ett fel (KeyError). Därför är det vanligt att först kontrollera om nyckeln finns.

Kodexempel: kontrollera innan uppslag

namn = "David"

if namn in telefonbok:
    print(telefonbok[namn])
else:
    print("Finns inte i telefonboken.")

I ett register kan du också lägga till, ändra och ta bort.

Kodexempel: lägga till, ändra, ta bort

telefonbok = {}

# lägga till
telefonbok["Anna"] = "070-111 22 33"

# ändra (samma syntax!)
telefonbok["Anna"] = "070-000 00 00"

# ta bort
del telefonbok["Anna"]

print(telefonbok)

Övning 4.6h – Elevregister

Du ska skapa ett register över elever där nyckeln är ett namn och värdet är en klass.

  1. Skapa ett dictionary med minst tre elever, t.ex. {"Alva": "TE23", "Nils": "NA22"}.
  2. Skriv ut klassen för en elev genom att slå upp nyckeln.
  3. Fråga användaren efter ett namn och skriv ut klassen (eller ett meddelande om namnet saknas).
  4. Lägg till en ny elev i registret.

Lösningsförslag

elev = {
    "Alva": "TE23",
    "Nils": "NA22",
    "Sara": "SA21"
}

# 1) uppslag
print(elev["Alva"])

# 2) fråga användaren
namn = input("Ange elevens namn: ")

if namn in elev:
    print(f"{namn} går i {elev[namn]}")
else:
    print("Eleven finns inte i registret.")

# 3) lägga till
nytt_namn = input("Ny elev: ")
ny_klass = input("Klass: ")
elev[nytt_namn] = ny_klass

print(elev)

Tips

  • Nycklar måste vara unika. Om du sätter samma nyckel igen skriver du över värdet.
  • Dictionary passar bra när du vill hitta något snabbt: nyckel → värde.

Uppgift m04u14 – Klassregister och statistik

Du ska bygga ett litet program som både fungerar som ett register och som räknar förekomster med hjälp av ett dictionary.

Del A – Klassregister

  1. Skapa ett tomt dictionary där nyckeln är ett namn och värdet är en klass (t.ex. "TE23").
  2. Låt användaren mata in namn och klass i en loop.
  3. Om användaren skriver ett tomt namn ska inmatningen avslutas.
  4. Skriv ut hela registret (namn + klass).

Del B – Slå upp och ta bort

  1. Fråga användaren efter ett namn.
  2. Om namnet finns i registret ska klassen skrivas ut.
  3. Om namnet inte finns ska ett tydligt meddelande visas.
  4. Ta sedan bort en valfri elev ur registret med del.

Del C – Räkna förekomster

  1. Skapa ett nytt dictionary som ska användas för att räkna hur många elever som går i varje klass.
  2. Loopa igenom klassregistret.
  3. Använd mönstret:
    • om klassen redan finns → öka räknaren
    • annars → skapa klassen med startvärde 1
  4. Skriv ut hur många elever som går i varje klass.

Tips

  • Använd if nyckel in dict innan du slår upp eller räknar.
  • Du kommer behöva två olika dictionaries i uppgiften.

Exempel på möjlig utskrift

Namn (Enter för att avsluta): Anna
Klass: 25NAa
Namn (Enter för att avsluta): Bo
Klass: 25NAb
Namn (Enter för att avsluta): Cilla
Klass: 25NAa
Namn (Enter för att avsluta): 
 
Klassregister:
Anna - 25NAa
Bo - 25NAb
Cilla - 25NAa
 
Sök efter elev: Bo
Bo går i 25NAb
 
Tog bort Anna ur registret.
 
Antal elever per klass:
25NAb: 1
25NAa: 1

4.6.5 List of dicts

Ibland räcker det inte med ett enda dictionary. Ofta vill du lagra flera poster, där varje post innehåller flera värden.

En vanlig lösning är då att använda en lista med dictionaries (på engelska: list of dicts).

Varje dictionary i listan representerar en post, till exempel en elev, en användare eller en film.

Kodexempel: elevlista (list of dicts)

elever = [
    {"namn": "Anna", "klass": "TE23", "poang": 18},
    {"namn": "Bo", "klass": "NA22", "poang": 15},
    {"namn": "Celine", "klass": "TE23", "poang": 20}
]

För att arbeta med datan loopar du över listan. Varje varv i loopen är då ett dictionary.

Kodexempel: loopa över list of dicts

for elev in elever:
    print(elev["namn"], "-", elev["klass"], "-", elev["poang"])

Utskrift

Anna - TE23 - 18
Bo - NA22 - 15
Celine - TE23 - 20

Du kan också använda villkor för att filtrera poster.

Kodexempel: filtrera elever

for elev in elever:
    if elev["poang"] >= 18:
        print(elev["namn"], "har", elev["poang"], "poäng")

Utskrift

Anna - TE23 - 18
Celine - TE23 - 20

Övning 4.6i – Lagerlista (kiosk)

Du ska arbeta med en lista som innehåller dictionaries. Varje dictionary är en vara i en kiosk.

  1. Skapa en lista med minst fyra varor. Varje vara ska ha: namn, pris och antal.
  2. Loopa över listan och skriv ut alla varor på formatet: Namn - pris kr (antal st).
  3. Räkna ut och skriv ut lagrets totala värde (pris * antal för varje vara).
  4. Skriv ut endast de varor som har antal = 0 (slut i lager).

Lösningsförslag

varor = [
    {"namn": "Banan", "pris": 6, "antal": 12},
    {"namn": "Choklad", "pris": 20, "antal": 0},
    {"namn": "Läsk", "pris": 18, "antal": 7},
    {"namn": "Tuggummi", "pris": 10, "antal": 0}
]

print("Alla varor:")
for vara in varor:
    print(f'{vara["namn"]} - {vara["pris"]} kr ({vara["antal"]} st)')

totalvarde = 0
for vara in varor:
    totalvarde += vara["pris"] * vara["antal"]

print("\nTotalt lagervärde:", totalvarde, "kr")

print("\nSlut i lager:")
for vara in varor:
    if vara["antal"] == 0:
        print("-", vara["namn"])

Uppgift m04u15 - Träningslogg

Du ska skapa ett litet program som lagrar träningspass. Varje pass sparas som ett dictionary och alla pass lagras i en lista med dictionaries.

Del A – Skapa en post (4.6.3)

  1. Skapa en variabel pass1 som är ett dictionary med nycklarna: aktivitet, minuter, intensitet.
  2. Skriv ut pass1 på en snygg rad, t.ex. Löpning - 30 min - 4/5.

Del B – Flera poster i en lista (4.6.5)

  1. Skapa en lista traning och lägg in minst tre pass (dictionaries).
  2. Loopa över listan och skriv ut alla pass.

Del C – Beräkningar och filtrering (4.6.4)

  1. Räkna ut och skriv ut den totala tiden (summa minuter).
  2. Räkna ut och skriv ut medeltid per pass (med två decimaler).
  3. Skriv ut endast de pass som har intensitet 4 eller 5.

Extra (frivillig)

  1. Låt användaren mata in ett nytt pass (aktivitet, minuter, intensitet) och lägg till i listan.

4.6.6 En cheat sheet på datastrukturer

Operation List (lista) Set (mängd) Tuple (tupel) Dictionary (ordlista)
Skapa tom datastruktur mylist = [] myset = set() mytuple = () mydict = {}
Skapa med två värden mylist = [1, 2] myset = {1, 2} mytuple = (1, 2) mydict = {"Anna": "a", "Bo": "b"}
Lägga till värde mylist.append(3) myset.add(3) Inte möjligt mydict["Celine"] = "c"
Ta bort värde mylist.remove(1)
del mylist[0]
myset.remove(1)
myset.discard(1)
Inte möjligt del mydict["Anna"]
Ändra befintligt värde mylist[0] = "ny" Inte tillämpligt Inte möjligt mydict["Anna"] = "ny"
Töm innehållet mylist.clear() myset.clear() Inte möjligt mydict.clear()
Ta bort hela variabeln del mylist del myset del mytuple del mydict
Skriva ut hela strukturen print(mylist) print(myset) print(mytuple) print(mydict)
Skriva ut ett värde print(mylist[0]) Ingen indexering print(mytuple[0]) print(mydict["Anna"])
Loopa igenom alla värden for e in mylist:
  print(e)
for e in myset:
  print(e)
(ingen ordning)
for e in mytuple:
  print(e)
for k, v in mydict.items():
  print(k, v)

4.7 Avrundning av momentet

Detta moment avslutas med två diagnoser som säkerställer att du har förstått grunderna:

  • En teoretisk diagnos i form av en quiz med 10 frågor på de viktigaste begreppen.
  • En praktisk diagnos där du får skriva kod och lösa en eller flera uppgifter med fokus på det du lärt dig i momentet.

Syftet är att både kontrollera dina kunskaper och ge dig en chans att öva på provliknande situationer.

4.7.1 Checklista inför diagnosen

För att vara förberedd bör du kunna:

Checklistan