Tilbake
2.3
Ordbøker og mengder

2.3 Ordbøker og mengder

Hashtabeller, ordbøker og mengdeoperasjoner.

60 min
6 oppgaver
OrdbøkerMengderHashtabellerNøkkel-verdi
Du leser den tradisjonelle versjonen
Din fremgang i kapitlet
0 / 6 oppgaver

Ordbøker og mengder

Lister er gode når du vil ha en ordnet sekvens. Men hva om du vil slå opp data raskt med en nøkkel? Eller håndtere unike elementer?

Da trenger du ordbøker (dict) og mengder (set)!

Disse datastrukturene brukes overalt: fra databaser til caching, fra JSON-parsing til å finne duplikater.

Definisjon
Ordbok (Dictionary) er en samling av nøkkel-verdi-par, der hver nøkkel er unik og brukes til å slå opp verdien.

Hashtabell er den underliggende datastrukturen for ordbøker. Den bruker en hash-funksjon til å konvertere nøkler til indekser for svært rask oppslag (O(1) i snitt).

Mengde (Set) er en samling av unike elementer uten rekkefølge. Mengder støtter matematiske operasjoner som union, snitt og differanse.

✏️Eksempel

Eksempel: Grunnleggende ordbok-operasjoner

# Lage en ordbok
person = {
    "navn": "Anna",
    "alder": 18,
    "by": "Oslo"
}

# Hente verdier
print(person["navn"])        # Anna
print(person.get("alder"))   # 18
print(person.get("land", "Norge"))  # Norge (standard hvis ikke finnes)

# Endre verdier
person["alder"] = 19

# Legge til nye nøkler
person["skole"] = "VG3"

# Sjekke om nøkkel finnes
if "by" in person:
    print(f"Bor i {person['by']}")

# Iterere
for nøkkel, verdi in person.items():
    print(f"{nøkkel}: {verdi}")

# Fjerne nøkler
del person["by"]

# Antall nøkler
antall = len(person)

Ordbøker gir O(1) oppslag – ekstremt raskt uansett størrelse!

Definisjon
Hvordan hashtabeller fungerer:

1. Hash-funksjon: Konverterer nøkkelen til et heltall (hash-kode)
2. Indeks: Hash-koden brukes til å finne riktig "bøtte" i en intern array
3. Lagring: Verdien lagres i den bøtten
4. Oppslag: Samme prosess brukes for å finne verdien raskt

Kollisjoner oppstår når to nøkler får samme hash. Pythons dict håndterer dette automatisk.

Eksempel:

# Intern representasjon (forenklet):
# hash("navn") -> 12345 -> bøtte[5] -> "Anna"
# hash("alder") -> 67890 -> bøtte[0] -> 18
✏️Eksempel

Eksempel: Brukstilfelle – Telling med ordbok

Ordbøker er perfekte for å telle forekomster:

def tell_ord(tekst):
    """Teller hvor mange ganger hvert ord forekommer."""
    ord_liste = tekst.lower().split()
    telling = {}

    for ord in ord_liste:
        if ord in telling:
            telling[ord] += 1
        else:
            telling[ord] = 1

    return telling

# Bruk
tekst = "hei hei verden hei"
resultat = tell_ord(tekst)
print(resultat)  # {'hei': 3, 'verden': 1}

# Finne mest frekvente ord
mest_frekvent = max(resultat, key=resultat.get)
print(f"Mest frekvent: {mest_frekvent} ({resultat[mest_frekvent]} ganger)")

Dette mønsteret brukes mye i tekstanalyse og statistikk.

✏️Eksempel

Eksempel: Grunnleggende mengde-operasjoner

# Lage mengder
tall1 = {1, 2, 3, 4, 5}
tall2 = {4, 5, 6, 7, 8}

# Legge til element
tall1.add(6)

# Fjerne element
tall1.remove(1)  # Feil hvis ikke finnes
tall1.discard(1)  # Ingen feil hvis ikke finnes

# Sjekke medlemskap
print(3 in tall1)  # True

# Union (alle unike elementer fra begge)
union = tall1 | tall2
print(union)  # {2, 3, 4, 5, 6, 7, 8}

# Snitt (elementer som finnes i begge)
snitt = tall1 & tall2
print(snitt)  # {4, 5, 6}

# Differanse (elementer i tall1, men ikke tall2)
diff = tall1 - tall2
print(diff)  # {2, 3}

# Symmetrisk differanse (elementer i én, men ikke begge)
sym_diff = tall1 ^ tall2
print(sym_diff)  # {2, 3, 7, 8}

Mengder eliminerer automatisk duplikater!

✏️Eksempel

Eksempel: Brukstilfelle – Finne duplikater

Mengder er perfekte for å finne duplikater i en liste:

def finn_duplikater(liste):
    """Finner duplikater i en liste."""
    sett_set = set()
    duplikater = set()

    for element in liste:
        if element in sett_set:
            duplikater.add(element)
        else:
            sett_set.add(element)

    return duplikater

# Bruk
tall = [1, 2, 3, 2, 4, 5, 3, 6]
print(finn_duplikater(tall))  # {2, 3}

# Enklere måte: liste -> set -> sammenligne lengder
def har_duplikater(liste):
    return len(liste) != len(set(liste))

print(har_duplikater(tall))  # True

Mengder gjør det enkelt å håndtere unikhet!

✏️Eksempel

Eksempel: JSON-lignende data med ordbøker

Ordbøker brukes mye for strukturert data (som JSON):

# Strukturert data
skole = {
    "navn": "Oslo VGS",
    "elever": [
        {
            "navn": "Anna",
            "alder": 17,
            "fag": ["Matematikk", "Fysikk", "IT"]
        },
        {
            "navn": "Bjørn",
            "alder": 18,
            "fag": ["Historie", "Norsk", "IT"]
        }
    ],
    "ansatte": 50
}

# Navigere strukturen
print(skole["navn"])                    # Oslo VGS
print(skole["elever"][0]["navn"])       # Anna
print(skole["elever"][1]["fag"][2])     # IT

# Finne alle som har IT
for elev in skole["elever"]:
    if "IT" in elev["fag"]:
        print(f"{elev['navn']} har IT")

Dette mønsteret er standard for API-data og konfigurasjoner.

Oppsummering

I dette kapittelet har du lært:

- Ordbøker lagrer nøkkel-verdi-par med O(1) oppslag via hashtabeller
- Mengder håndterer unike elementer og støtter matematiske operasjoner
- Union (|), snitt (&), differanse (-) for mengdeoperasjoner
- Ordbøker er perfekte for JSON-data, caching og telling
- Mengder er perfekte for å eliminere duplikater og sjekke medlemskap

Neste kapittel: Vi bruker disse strukturene i designmønstre!

Dette kapitlet er skrevet av Anthropics toppmodeller (Claude Opus og Claude Fable) og er foreløpig ikke manuelt gjennomgått — kvalitetskontrollen gjøres av uavhengige KI-agenter, og innmeldte feil rettes fortløpende. Funnet en feil? Meld fra, så retter vi den. Les mer om hvordan innholdet lages.