Hashtabeller, ordbøker og mengdeoperasjoner.
Ordbøker og mengder
Lister er gode når du vil ha ein ordna sekvens. Men kva om du vil slå opp data raskt med ein nøkkel? Eller handtere unike element?
Da treng du ordbøker (dict) og mengder (set)!
Desse datastrukturane vert brukte overalt: frå databasar til caching, frå JSON-parsing til å finne duplikat.
Hashtabell er den underliggjande datastrukturen for ordbøker. Ho bruker ein hash-funksjon til å konvertere nøklar til indeksar for svært raskt oppslag (O(1) i snitt).
Mengde (Set) er ei samling av unike element utan rekkjefølgje. Mengder støttar matematiske operasjonar som union, snitt og differanse.
Eksempel: Grunnleggjande ordbok-operasjonar
# 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 storleik!
1. Hash-funksjon: Konverterer nøkkelen til eit heiltal (hash-kode)
2. Indeks: Hash-koden vert brukt til å finne rett "bøtte" i ein intern array
3. Lagring: Verdien vert lagra i den bøtta
4. Oppslag: Same prosess vert brukt for å finne verdien raskt
Kollisjonar oppstår når to nøklar får same hash. Ordboka (dict) i Python handterer dette automatisk.
Eksempel:
# Intern representasjon (forenklet):
# hash("navn") -> 12345 -> bøtte[5] -> "Anna"
# hash("alder") -> 67890 -> bøtte[0] -> 18Eksempel: Brukstilfelle – Telling med ordbok
Ordbøker er perfekte for å telje førekomstar:
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 vert mykje brukt i tekstanalyse og statistikk.
Eksempel: Grunnleggjande mengde-operasjonar
# 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 duplikat!
Eksempel: Brukstilfelle – Finne duplikat
Mengder er perfekte for å finne duplikat i ei 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)) # TrueMengder gjer det enkelt å handtere unikheit!
Eksempel: JSON-liknande data med ordbøker
Ordbøker vert mykje brukte 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 konfigurasjonar.
Oppsummering
I dette kapittelet har du lært:
- Ordbøker lagrar nøkkel-verdi-par med O(1) oppslag via hashtabellar
- Mengder handterer unike element og støttar matematiske operasjonar
- Union (|), snitt (&), differanse (-) for mengdeoperasjonar
- Ordbøker er perfekte for JSON-data, caching og telling
- Mengder er perfekte for å eliminere duplikat og sjekke medlemskap
Neste kapittel: Vi bruker desse strukturane i designmønster!
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.