Programmering nivå 2

Kap 2.4 – Dictionaries och tuples

Välj rätt datastruktur när värden behöver namn, ordning eller skydd mot ändring.

Mål med lektionen

När du har arbetat klart med denna lektion ska du:

  • Förstå vad en dictionary och en tuple är.
  • Kunna skapa och använda dictionaries för att lagra nyckel-värde-par.
  • Förstå tuples som fasta, ordnade samlingar av data.
  • Veta när du bör använda dessa strukturer i stället för listor.

Så här lär du dig bäst

Testa varje struktur med olika datatyper och i kombination med loopar och funktioner. Jämför hur det känns att använda listor, dictionaries och tuples i olika situationer. Reflektera över varför vissa datastrukturer är mer lämpliga än andra beroende på sammanhang.

Vad är en dictionary?

En dictionary i Python är en samling av nyckel-värde-par, där varje nyckel är unik. Den används när du vill koppla ett värde till ett specifikt namn eller en identitet.

person = {
    "name": "Anna",
    "age": 25,
    "city": "Stockholm"
}

Åtkomst

print(person["name"])  # Anna

Om du försöker hämta en nyckel som inte finns får du KeyError. När du är osäker kan du använda get() och ange ett standardvärde:

print(person.get("email", "Ingen e-post finns"))

Ändra eller lägga till

person["age"] = 26
person["email"] = "alice@example.com"

Ta bort

del person["city"]

Loopa genom en dictionary

for key, value in person.items():
    print(f"{key}: {value}")

Realistiskt exempel: flera dictionaries i en lista

Ofta använder du dictionaries för objektliknande data och lägger flera sådana dictionaries i en lista.

books = [
    {"title": "Python", "year": 2024},
    {"title": "Webbutveckling", "year": 2023}
]

for book in books:
    print(book["title"])

Interaktiv övning: dictionary steg för steg

Testa att hämta, ändra, lägga till, ta bort och loopa genom en dictionary. Kör ett val i taget och se hur innehållet förändras.

Prova till exempel att:

  • hämta nyckeln name
  • ändra age till 26
  • lägga till nyckeln email
  • ta bort city
  • loopa genom hela dictionaryn med items()
person = { 'name': 'Anna', 'age': 25, 'city': 'Stockholm' }

Programmering 2-koppling: dictionaries passar när varje värde behöver en tydlig nyckel, till exempel persondata, inställningar eller poängtabeller.

Vad är en tuple?

En tuple är en ordnad, oföränderlig samling. Den används när du inte vill att värden ska kunna ändras.

Oföränderlig betyder att du inte kan byta ut, lägga till eller ta bort positioner i tuplen. Om en tuple innehåller ett ändringsbart objekt, till exempel en lista, kan själva listan fortfarande ändras. Det viktiga här är att tuple-strukturen är fast.

coordinates = (10, 20)
print(coordinates[0])  # 10

Tuple-uppackning

Tuple-uppackning betyder att du tar värdena från en tuple och lägger dem i separata variabler på en gång. Antalet variabler måste matcha antalet värden i tuplen.

coordinates = (10, 20)

x, y = coordinates

print(x)  # 10
print(y)  # 20

Det här är samma idé som när en funktion returnerar flera värden:

def get_user():
    return ("Anna", 25)

name, age = get_user()

print(name)  # Anna
print(age)   # 25

Interaktiv övning: tuple

Testa att läsa värden från en tuple och jämför med vad som händer om du försöker ändra den. Tuples är ordnade, men oföränderliga.

Prova till exempel att:

  • läsa index 0 och få första värdet
  • läsa index 1 och få andra värdet
  • packa upp tuplen med x, y = coordinates
  • försöka ändra index 0 och se felmeddelandet
coordinates = (10, 20)

Programmering 2-koppling: tuples passar när värden hör ihop och inte ska ändras, till exempel koordinater eller fasta inställningar.

Tuples används ofta för att returnera flera värden från en funktion. Då kan mottagaren packa upp värdena direkt i tydliga variabler:

def get_user():
    return ("Anna", 25)

name, age = get_user()
print(name)
print(age)

Skillnad mot listor

  • Listor: ändringsbara, alltså mutable.
  • Tuples: fasta, alltså immutable.

Använd en tuple när värdena hör ihop och inte ska bytas ut, till exempel en koordinat (x, y). Använd en dictionary när varje värde behöver ett tydligt namn, till exempel {"name": "Anna", "age": 25}.

Jämförelse: när används vad?

Struktur Egenskaper Använd när du vill...
List Ordnad, ändringsbar Lagra flera värden i en ordning
Dictionary Nyckel-värde-par Knyta namn eller etikett till varje värde
Tuple Ordnad, oföränderlig Lagra en fast uppsättning värden

Öva själv

Övning 1: Skapa en bok-dictionary

Skapa en dictionary för en bok med nycklarna title, author och year. Skriv ut varje värde genom att använda rätt nyckel.

Kontrollera programmet

  • Titeln, författaren och året ska skrivas ut.
  • Ändra bokens titel och kontrollera att utskriften ändras.
  • Använd get() för att försöka hämta nyckeln isbn med ett eget standardmeddelande.

Fundera: Vad är skillnaden mellan en nyckel och dess värde?

När du har försökt själv: visa lösningsförslaget till övning 1 på GitHub.

Övning 2: Ändra personuppgifter

Skapa en dictionary med namn, ålder och stad. Ändra åldern, lägg till en e-postadress och ta bort staden med del. Skriv ut dictionaryn före och efter ändringarna.

Kontrollera programmet

  • Åldern ska ha fått ett nytt värde.
  • En ny nyckel för e-post ska finnas.
  • Nyckeln för stad ska vara borttagen.

Fundera: Hur avgör Python om en tilldelning ändrar ett värde eller lägger till ett nytt nyckel-värde-par?

När du har försökt själv: visa lösningsförslaget till övning 2 på GitHub.

Övning 3: Skriv ut alla nycklar och värden

Skriv funktionen print_dictionary(dictionary). Funktionen ska ta emot en dictionary och använda items() för att skriva ut varje nyckel tillsammans med dess värde.

Testa funktionen med

  • en dictionary för en person.
  • en dictionary med användarnamn och poäng.
  • en tom dictionary.

Fundera: Vad innehåller variablerna key och value under varje varv i loopen?

När du har försökt själv: visa lösningsförslaget till övning 3 på GitHub.

Övning 4: Returnera och packa upp en tuple

Skriv funktionen get_user() som returnerar en tuple med ett namn och en ålder. Anropa funktionen, packa upp tuplen i två variabler och skriv ut värdena separat.

Kontrollera programmet

  • Funktionen ska returnera exakt två värden i en tuple.
  • Antalet variabler vid uppackningen ska vara två.
  • Skriv också ut värdet på index 0 direkt från tuplen.

Fundera: Vad händer om antalet variabler inte matchar antalet värden i tuplen?

När du har försökt själv: visa lösningsförslaget till övning 4 på GitHub.

Övning 5: Sök i en lista med böcker

Svårare övning: Här kombinerar du en lista med dictionaries, funktioner och linjär sökning.

Skapa en lista som innehåller minst tre bok-dictionaries. Varje bok ska ha nycklarna title, author och year. Skriv funktionen find_book(books, target_title) som går igenom listan och returnerar den dictionary vars titel matchar sökningen. Om ingen bok hittas ska funktionen returnera en tom dictionary. Skriv ut den hittade bokens uppgifter med items().

Testa funktionen med

  • titeln på den första boken.
  • titeln på den sista boken.
  • en titel som inte finns.

Fundera: Varför returnerar funktionen hela bokens dictionary och inte bara titeln?

När du har försökt själv: visa lösningsförslaget till övning 5 på GitHub.

Övning 6: Poängregister med dictionary

Svårare övning: Här kombinerar du en dictionary med funktioner, meny, loopar och säker inmatning.

Skapa ett menyprogram med alternativen 1. Lägg till eller ändra poäng, 2. Visa alla poäng, 3. Sök efter användare och 4. Avsluta. Användarnamn ska vara nycklar och heltalspoäng ska vara värden. Felaktig poänginmatning ska hanteras med try och except ValueError. Använd items() vid utskrift och get() vid sökning.

Testa programmet genom att

  • visa registret när det är tomt.
  • lägga till minst tre användare.
  • ändra poängen för en användare som redan finns.
  • söka efter en användare som finns och en som saknas.
  • skriva text i stället för poäng och därefter avsluta.

Fundera: Varför ersätts det tidigare värdet när samma användarnamn används igen?

När du har försökt själv: visa lösningsförslaget till övning 6 på GitHub.

Reflektion

  • När känns det bäst att använda en dictionary istället för en lista?
  • Hur påverkar det programlogiken att en tuple inte kan ändras?
  • Vilken struktur tycker du är mest användbar i ett menybaserat program?

Tillbaka till Kapitel 2