Tilbake
1.5

1.5 Dictionaries og nøstede dictionaries

Ordbøker, nøstede ordbøker og `dict(zip(...))` — datastrukturen fillesingsoppgavene (sjanger L, 100 %) bygger på.

45 min
8 oppgaver
Dictionariesnøstede dictionaries
Din fremgang i kapitlet
0 / 8 oppgaver
Forkunnskaper:

- Kap. 1.1 — Variabler, datatyper, uttrykk og operatorpresedens — at en verdi har en datatype, og at = betyr «la navnet peke på resultatet».
- Kap. 1.2 — Lister, indeksering og slicing — lister og indeksering, som ordboka skal sammenlignes med.
- Kap. 1.3 — Løkker — for, while, range og nøstede løkkerfor-løkka, akkumulatormønsteret og zip.
- Kap. 1.4 — Strenger, f-strenger og formatert utskrift — f-strenger, som brukes til å skrive pene tabeller i eksemplene.

Har du aldri programmert før, er Programmering med Python en mykere inngang du kan bla gjennom først.

Løkke 1 — Oppslag etter navn i stedet for etter posisjon (~10 min)

Tre målestasjoner rapporterer temperatur: Blindern 4,2 grader, Tryvann −1,5 grader og Bygdøy 5,0 grader. Med lister må du holde to ting i hodet samtidig — en liste med navn og en liste med tall — og passe på at plass nummer 1 i den ene hører til plass nummer 1 i den andre.

En ordbok fjerner det bokholderiet. Der slår du opp på navnet direkte: «hva målte Tryvann?». Det er samme idé som i en ordliste, der du slår opp på ordet og får forklaringen. Datastrukturen heter dict i Python, og den er ryggraden i alle fillesingsoppgavene i Del 8.

Ordbok (`dict`)

En ordbok er en samling par av nøkkel og verdi. Du skriver den med krøllparenteser, kolon mellom nøkkel og verdi, og komma mellom parene.

Nøkkelen er det du slår opp på, verdien er det du får. En tom ordbok skrives {}.

temperatur = {'Blindern': 4.2, 'Tryvann': -1.5, 'Bygdoy': 5.0}
print(temperatur['Tryvann'])
print(len(temperatur))
print(temperatur)

Utskrift:

-1.5
3
{'Blindern': 4.2, 'Tryvann': -1.5, 'Bygdoy': 5.0}

Merk hvordan Python skriver ut en hel ordbok: krøllparenteser, fnutter rundt strengnøklene, kolon og mellomrom. Det er den formen du må gjengi tegn for tegn i en sporingsoppgave.

Oppslag `d[nøkkel]`

Hakeparentes med nøkkelen inni gir verdien: temperatur['Tryvann'] er -1.5.

Dette er den store forskjellen fra en liste. I en liste betyr x[1] «element nummer 1 regnet fra 0». I en ordbok betyr d[1] «verdien som hører til nøkkelen 1» — og finnes ikke den nøkkelen, stopper programmet. Posisjon spiller ingen rolle.

Finnes ikke nøkkelen, får du feilen KeyError med nøkkelen i meldingen.

Innsetting og oppdatering `d[nøkkel] = verdi`

Samme skrivemåte brukes til to ting, og Python avgjør selv hvilken:

- Finnes nøkkelen ikke, blir paret lagt til.
- Finnes den fra før, blir verdien overskrevet.

Det er ingen egen «legg til»-metode slik lister har append.

temperatur = {'Blindern': 4.2}
temperatur['Tryvann'] = -1.5
temperatur['Blindern'] = 4.8
print(temperatur)

Utskrift:

{'Blindern': 4.8, 'Tryvann': -1.5}

Første linje la til et nytt par, andre linje endret et som fantes. Ordboka har fortsatt to par.

`nøkkel in d`

Sjekker om nøkkelen finnes, og gir True eller False. Den ser bare på nøklene — aldri på verdiene.

temperatur = {'Blindern': 4.2, 'Tryvann': -1.5}
print('Tryvann' in temperatur)
print(-1.5 in temperatur)

Utskrift:

True
False

Andre linje er fellen: -1.5 er en verdi i ordboka, men ingen nøkkel, så svaret er False. Vil du lete i verdiene, må du skrive -1.5 in temperatur.values().

Denne testen er den vanlige måten å unngå KeyError på: sjekk først, slå opp etterpå.

`len(d)`

Antall par i ordboka — altså antall nøkler, ikke antall tegn eller antall nivåer.

For en nøstet ordbok teller len bare det ytterste nivået: har du tre stasjoner med tolv måneder hver, gir len(data) tallet 3. Vil du telle månedene for én stasjon, skriver du len(data['Blindern']).

✏️Eksempel 1: Én måling som ordbok

En værstasjon leverer fire opplysninger om samme måling: stasjonsnavn, temperatur, vindstyrke og om det frøs. Legg dem i én ordbok, skriv ut navn og temperatur, trekk fra 0,5 grader for en kjent målefeil, og sjekk om nedbør er registrert.

Her er nøklene beskrivelser av hva tallene betyr. Det gjør koden lesbar: maaling['temp'] sier hva verdien er, mens maaling[1] ikke hadde sagt noe.

maaling = {'stasjon': 'Blindern', 'temp': 4.2, 'vind': 3, 'frost': False}
print(len(maaling))
print(maaling['stasjon'], maaling['temp'])
maaling['temp'] = maaling['temp'] - 0.5
print(maaling['temp'])
print('nedbor' in maaling)

Utskrift:

4
Blindern 4.2
3.7
False

Fire ting å merke seg. len gir 4 fordi det er fire par. print med to argumenter setter ett mellomrom mellom dem. Linjen som oppdaterer temp leser den gamle verdien på høyresiden og skriver den nye på venstresiden — nøyaktig som x = x + 1. Og siste linje er False fordi ordboka aldri fikk noen 'nedbor'-nøkkel.

📝Oppgave 1

(Innstegsoppgave — ren gjengivelse og minimal sporing.) La

kilder = {'vann': 41, 'vind': 16, 'sol': 3}

Svar på hvert punkt for seg.

a) Hva gir kilder['vind']?

b) Hva gir len(kilder)?

c) Hva gir 'sol' in kilder?

d) Hva gir 41 in kilder?

Løkke 2 — Å gå gjennom en ordbok (~10 min)

En ukes nedbørsmålinger ligger i en ordbok med ukedag som nøkkel. Du vil skrive ut alle parene, summere millimeterne og finne den våteste dagen. Til alt dette trenger du å gå gjennom ordboka med en for-løkke.

Python gir deg tre innganger: over nøklene, over verdiene, eller over begge samtidig. Å velge riktig av dem er halve jobben, og å vite hvilken av dem en gitt løkke faktisk bruker, er en fast kodesporingsfelle.

`for k in d:`

En for-løkke rett på ordboka går gjennom nøklene — ikke verdiene, ikke parene.

Vil du ha verdien også, slår du den opp inne i løkka med d[k].

nedbor = {'mandag': 4, 'tirsdag': 0, 'onsdag': 12}
for dag in nedbor:
    print(dag, nedbor[dag])

Utskrift:

mandag 4
tirsdag 0
onsdag 12

Dette er den vanligste dict-løkka i faget, og den vanligste sporingsfellen er å tro at dag er verdien. Løkkevariabelen er alltid nøkkelen.

`d.keys()` og `d.values()`
d.keys() gir alle nøklene, d.values() alle verdiene — begge i innsettingsrekkefølge.

De er ikke lister, men de kan brukes i en for-løkke og i sum, max, min og len. Trenger du en ekte liste (for å indeksere eller skrive ut), pakker du dem i list(...).

nedbor = {'mandag': 4, 'tirsdag': 0, 'onsdag': 12}
print(list(nedbor.keys()))
print(list(nedbor.values()))
print(sum(nedbor.values()))

Utskrift:

['mandag', 'tirsdag', 'onsdag']
[4, 0, 12]
16

sum(nedbor.values()) er kortformen for hele akkumulatormønsteret fra kap. 1.3, på én linje.

`d.items()`

Gir paret (nøkkel, verdi) for hvert par i ordboka, slik at du kan pakke det ut i to løkkevariabler i én operasjon.

Et slikt par kalles en tuppel: en fast sammenstilling av to eller flere verdier, skrevet med komma og vanligvis parenteser rundt. Den ligner en liste, men kan ikke endres etterpå. Du møter tupler igjen som returverdi fra funksjoner i kap. 1.6.

Rekkefølgen er alltid nøkkel først, verdi etterpå — akkurat som enumerate alltid gir indeks først.

nedbor = {'mandag': 4, 'tirsdag': 0, 'onsdag': 12}
for dag, mm in nedbor.items():
    print(f'{dag:9s}{mm:3d} mm')

Utskrift:

mandag     4 mm
tirsdag    0 mm
onsdag    12 mm

Bredden 9 og 3 i f-strengen sørger for at kolonnene står rett — se kap. 1.4.

Rekkefølgen i en ordbok

Fra Python 3.7 husker en ordbok innsettingsrekkefølgen: parene kommer ut i den rekkefølgen de ble satt inn, uansett hva nøklene heter.

Den er altså ikke sortert alfabetisk, og ikke tilfeldig.

d = {}
d['c'] = 3
d['a'] = 1
d['b'] = 2
print(d)
print(list(d))

Utskrift:

{'c': 3, 'a': 1, 'b': 2}
['c', 'a', 'b']

Legg merke til at list(d) gir nøklene, ikke parene — det er samme regel som for for k in d. I en sporingsoppgave må du derfor holde orden på i hvilken rekkefølge nøklene ble satt inn.

✏️Eksempel 2: Total, snitt og våteste dag

Fire dagers nedbør ligger i en ordbok. Skriv ut samlet nedbør, hvilken dag som var våtest, og gjennomsnittet med to desimaler.

Mønsteret er akkumulatoren fra kap. 1.3, men over .items() i stedet for over en liste. Startverdien for «våteste dag» er den første nøkkelen — ikke et tall, for det er en dag vi skal svare med.

nedbor = {'mandag': 4, 'tirsdag': 0, 'onsdag': 12, 'torsdag': 7}
total = 0
toppdag = 'mandag'
for dag, mm in nedbor.items():
    total += mm
    if mm > nedbor[toppdag]:
        toppdag = dag
print(total, toppdag)
print(f'{total / len(nedbor):.2f}')

Utskrift:

23 onsdag
5.75

Tre detaljer sensor ser etter. total starter på 0 før løkka, ellers nullstilles den hver runde. Sammenligningen er mm > nedbor[toppdag] — vi må slå opp verdien til den nåværende topplederen, for toppdag er et navn, ikke et tall. Og len(nedbor) er antall dager, som er det vi skal dele på.

📝Oppgave 2

(Midtveisnivå, sjanger A — kodesporing, altså «hva skriver programmet ut?».) Hva skriver programmet ut? Skriv utskriften nøyaktig, linje for linje.

d = {'p': 2, 'q': 5}
for k in d:
    d[k] = d[k] * 10
print(d)
print(sum(d.values()), max(d.values()))

Løkke 3 — Å bygge en ordbok fra to lister, og å slå opp trygt (~8 min)

Data kommer sjelden ferdig som ordbok. Oftere har du to lister som hører sammen — en med navn og en med tall — eller du skal telle opp noe der du ikke vet på forhånd hvilke nøkler som dukker opp. Til begge deler finnes det ett fast grep hver.

`dict(zip(nøkler, verdier))`

Lager en ordbok av to sekvenser: den første leverer nøklene, den andre verdiene, parret posisjon for posisjon.

zip stopper ved den korteste av de to — det fyller ikke ut. Er navnelista lengre enn tallista, forsvinner de overskytende navnene uten noen feilmelding. Det er samme regel som i kap. 1.3, og den er lett å overse her fordi resultatet ser helt normalt ut.

stasjoner = ['Blindern', 'Tryvann', 'Bygdoy']
maalinger = [4.2, -1.5]
print(dict(zip(stasjoner, maalinger)))

Utskrift:

{'Blindern': 4.2, 'Tryvann': -1.5}

Tre navn inn, to tall inn, to par ut. Bygdøy ble borte.

`d.get(nøkkel, standard)`

Slår opp som d[nøkkel], men gir standardverdien i stedet for å stoppe programmet når nøkkelen mangler.

Utelater du standardverdien, blir den None — Pythons verdi for «ingenting», som skrives ut som None. Merk at .get aldri endrer ordboka: den setter ikke inn noe.

temperatur = {'Blindern': 4.2, 'Tryvann': -1.5}
print(temperatur.get('Tryvann', 0.0))
print(temperatur.get('Fornebu', 0.0))
print(temperatur.get('Fornebu'))
print(temperatur)

Utskrift:

-1.5
0.0
None
{'Blindern': 4.2, 'Tryvann': -1.5}

Siste linje viser at ordboka er uendret — 'Fornebu' ble aldri lagt til.

Nøkler er unike

En nøkkel kan bare finnes én gang. Skriver du samme nøkkel to ganger i samme krøllparentes, vinner den siste — uten advarsel.

temperatur = {'Blindern': 4.2, 'Tryvann': -1.5, 'Blindern': 4.8}
print(temperatur)
print(len(temperatur))

Utskrift:

{'Blindern': 4.8, 'Tryvann': -1.5}
2

Merk at 'Blindern' beholder sin plass fra første gang den ble satt inn, men får verdien fra siste. Det er nøyaktig samme regel som ved oppdatering.

Hva kan være nøkkel?

Nøkler må være verdier som ikke kan endres: strenger, tall og sannhetsverdier går bra. Tekstnøkler er det vanlige i faget, men årstall som heltall er også naturlig.

En liste kan ikke være nøkkel — den kan endres, og Python nekter med en TypeError. Verdien derimot kan være hva som helst, også en liste eller en ny ordbok. Nettopp det siste er det nøstede ordbøker bygger på.

✏️Eksempel 3: Telle uten å vite nøklene på forhånd

Tell hvor mange ganger hver bokstav forekommer i teksten 'abrakadabra', og skriv ut resultatet, antall forekomster av 'a' og antall ulike bokstaver.

Problemet er at du ikke vet hvilke nøkler som trengs før du har sett teksten. .get(tegn, 0) løser det på én linje: «hent den gamle tellingen, eller 0 hvis bokstaven ikke er sett før».

antall = {}
for tegn in 'abrakadabra':
    antall[tegn] = antall.get(tegn, 0) + 1
print(antall)
print(antall['a'], len(antall))

Utskrift:

{'a': 5, 'b': 2, 'r': 2, 'k': 1, 'd': 1}
5 5

Legg merke til rekkefølgen i utskriften: a, b, r, k, d — det er den rekkefølgen bokstavene dukker opp første gang i ordet, ikke alfabetisk og ikke etter antall. Og de to femtallene på siste linje betyr to helt forskjellige ting: fem a-er, og fem ulike bokstaver.

Uten .get måtte du skrevet tre linjer med if tegn in antall:. Begge deler gir full uttelling; .get-formen er den korte, idiomatiske.

📝Oppgave 3

(Midtveisnivå, sjanger A — kodesporing.) Hva skriver programmet ut?

kilder = {'vann': 41, 'vind': 16, 'sol': 3}
navn = list(kilder.keys())
tall = list(kilder.values())
print(navn[0], tall[-1])
print(dict(zip(tall, navn)))

📝Oppgave 4

(Midtveisnivå, sjanger A — kodesporing.) Hva skriver programmet ut?

maaned = ['mai', 'juni', 'juli']
grader = [12.4, 16.1]
d = dict(zip(maaned, grader))
print(len(d))
print(d.get('juli', -1))
print(d)

📝Oppgave 5
Eksamensnivå, sjanger…

En liste med energikilder er registrert flere ganger, én linje per kraftverk:

kraftverk = [['vann', 12], ['vind', 5], ['vann', 30], ['sol', 3], ['vind', 11]]

a) Skriv kode som bygger ordboka total der nøkkelen er energikilden og verdien er summen av alle tallene for den kilden.

b) Skriv ut hver kilde og summen på formen vann 42, én linje per kilde.

Løkke 4 — Nøstede ordbøker (~12 min)

— naturlig pausepunkt —

Nå kommer den delen eksamen faktisk måler. Målestasjonene leverer ikke ett tall hver, men en verdi per måned. Du trenger altså to nøkler for å komme fram til et tall: først hvilken stasjon, så hvilken måned.

Løsningen er at verdien i en ordbok selv er en ordbok. Det kalles en nøstet ordbok, og det er nøyaktig den strukturen fillesingsoppgavene i Del 8 ber om — 8 til 12 poeng, i hvert eneste sett.

Nøstet ordbok `d[ytre][indre]`

En ordbok der hver verdi selv er en ordbok. Oppslaget skjer i to trinn, fra venstre: data['Blindern'] gir hele den indre ordboka, og data['Blindern']['juni'] går ett skritt videre og gir tallet.

data = {}
data['Blindern'] = {}
data['Blindern']['mai'] = 12.4
data['Blindern']['juni'] = 16.1
data['Tryvann'] = {'mai': 9.8, 'juni': 13.2}
print(data['Blindern']['juni'])
print(data)

Utskrift:

16.1
{'Blindern': {'mai': 12.4, 'juni': 16.1}, 'Tryvann': {'mai': 9.8, 'juni': 13.2}}

De to stasjonene er bygget på hver sin måte — den første par for par, den andre med hele den indre ordboka ferdig skrevet. Resultatet er det samme.

📜Mønsteret: bygg en nøstet ordbok rad for rad

Dette er kodemønsteret hele sjanger L hviler på, og det ser likt ut hver gang. Du har rader med tre opplysninger — ytre nøkkel, indre nøkkel og en verdi — og skal bygge opp strukturen mens du går gjennom dem:

rader = [['Blindern', 'mai', 12.4], ['Blindern', 'juni', 16.1], ['Tryvann', 'mai', 9.8]]
data = {}
for stasjon, maaned, verdi in rader:
    if stasjon not in data:
        data[stasjon] = {}
    data[stasjon][maaned] = verdi
print(data)
for stasjon in data:
    for maaned in data[stasjon]:
        print(stasjon, maaned, data[stasjon][maaned])

Utskrift:

{'Blindern': {'mai': 12.4, 'juni': 16.1}, 'Tryvann': {'mai': 9.8}}
Blindern mai 12.4
Blindern juni 16.1
Tryvann mai 9.8

Tre faste trekk, og de tre er det sensor ser etter:

1. data = {} før løkka. Strukturen bygges opp underveis, ikke skrives ferdig.
2. if stasjon not in data: data[stasjon] = {}. Den indre ordboka må finnes før du kan sette noe inn i den. Uten disse to linjene stopper programmet.
3. data[stasjon][maaned] = verdi — først da settes tallet inn, med begge nøklene.

Utlesningen er speilbildet: en ytre løkke over stasjonene og en indre over månedene for nettopp den stasjonen. Legg merke til at den indre løkka går over data[stasjon], ikke over data.

Iterasjon over to nivåer

En nøstet ordbok leses med en løkke inne i en løkke: den ytre gir deg de ytre nøklene, den indre går over d[ytre].

Vil du ha både indre nøkkel og verdi, bruker du .items() på det indre nivået. Og trenger du hele den indre ordboka som en enhet — for eksempel for å summere den — kan du bruke .items() på det ytre nivået i stedet:

data = {'nord': {'uke1': 3, 'uke2': 5}, 'sor': {'uke1': 8}}
total = 0
for omrade in data:
    for uke in data[omrade]:
        total += data[omrade][uke]
print(total)

Utskrift:

16

De indre ordbøkene trenger ikke ha like mange nøkler. Her har 'nord' to uker og 'sor' bare én, og løkka bryr seg ikke.

✏️Eksempel 4: Månedstemperaturer for tre stasjoner (eksamensnivå)

Tre målestasjoner har månedssnitt for mai og juni. Skriv ut en tabell med stasjonsnavn og årssnittet for de månedene stasjonen har, med to desimaler, og til slutt antall stasjoner og antall måneder for Blindern.

Når hele strukturen er skrevet ferdig i koden, kan den ytre løkka bruke .items() og få den indre ordboka rett i hånda som maaneder. Da er maaneder.values() alle tallene for den stasjonen, og snittet er én linje.

data = {'Blindern': {'mai': 12.4, 'juni': 16.1},
        'Tryvann': {'mai': 9.8, 'juni': 13.2},
        'Bygdoy': {'mai': 13.0, 'juni': 16.6}}
for stasjon, maaneder in data.items():
    snitt = sum(maaneder.values()) / len(maaneder)
    print(f'{stasjon:9s}{snitt:6.2f}')
print(len(data), len(data['Blindern']))

Utskrift:

Blindern  14.25
Tryvann   11.50
Bygdoy    14.80
3 2

Merk de to len-verdiene på siste linje: len(data) er 3 fordi det er tre stasjoner på ytterste nivå, mens len(data['Blindern']) er 2 fordi Blindern har to måneder. Det er den forskjellen som avgjør flest ordbok-flervalg på midtveis.

Snittet regnes ut fra den enkelte stasjonens egne måneder, ikke fra et fast tall. Det er en vane verdt å ta med seg: hardkodet / 2 ville vært feil så snart en stasjon manglet en måned.

📝Oppgave 6

(Midtveisnivå, sjanger A — kodesporing i nøstet ordbok.) Hva skriver programmet ut?

data = {'nord': {'uke1': 3, 'uke2': 5}, 'sor': {'uke1': 8}}
print(len(data), len(data['nord']))
print('uke2' in data['sor'])
print(data['sor'].get('uke2', 0))

📝Oppgave 7
Eksamensnivå, sjanger…

Målinger fra tre bydeler ligger som rader med bydel, uke og antall:

rader = [['Sagene', 'uke1', 12], ['Grunerlokka', 'uke1', 30],
         ['Sagene', 'uke2', 4], ['Grunerlokka', 'uke2', 25], ['Frogner', 'uke1', 9]]

a) Bygg den nøstede ordboka data slik at data['Sagene']['uke2'] er 4.

b) Skriv ut bydelen med høyest total, og totalen.

c) Forklar hvorfor programmet stopper hvis du fjerner de to linjene som oppretter den indre ordboka.

Løkke 5 — Ordbok eller liste? (~5 min)

Til slutt en avgjørelse du må ta i hver eneste kodeoppgave: skal dataene ligge i en liste eller i en ordbok? Svaret følger av hvordan du skal finne dem igjen.

Ordbok mot liste
Liste når tingene har en naturlig rekkefølge og du henter dem etter posisjon: målinger i tidsrekkefølge, punkter langs en akse, ledd i en rekke.

Ordbok når tingene har et navn og du henter dem etter navn: stasjon, bydel, år, artsnavn.

maaling = {2020: 5.1, 2021: 6.3}
print(maaling[2021])
liste = [5.1, 6.3]
print(liste[1])

Utskrift:

6.3
6.3

Samme svar, to helt ulike spørsmål: ordboka ble spurt om året 2021, lista om plass nummer 1. Blander du de to, får du enten feil tall eller en KeyError — og på eksamen er «hvilken av disse to er dette?» selve poenget i mange flervalgsspørsmål.

📝Oppgave 8
Eksamensnivå, sjanger A

Hva skriver programmet ut? Skriv utskriften nøyaktig, linje for linje.

d = {'x': [1, 2], 'y': [3]}
d['x'].append(9)
print(d)
print(len(d), len(d['x']))

API- og konstruksjonsliste

Begrepsbank

Begrepsbanken er flashcard-/repetisjonsstoff — den gjentar det du nettopp har lest. Hopp trygt over ved førstegangslesing; tidsanslaget for kapitlet gjelder kjernestoffet.

Nøkkel og verdi
Nøkkelen er det du slår opp på, verdien er det du får igjen. Paret hører sammen, og ordboka er en samling slike par.

Nøklene er unike, verdiene trenger ikke være det: to stasjoner kan gjerne ha målt samme temperatur, men to nøkler kan ikke hete det samme.

Tuppel

En fast sammenstilling av flere verdier, skrevet med komma: ('mandag', 4). Den ligner en liste, men kan ikke endres etter at den er laget.

Du møter tupler tre steder i boka: som par fra .items() og enumerate, som flere returverdier fra en funksjon i kap. 1.6, og som tidsintervallet (0, T) i ODE-løserne i kap. 7.2.

`None`

Pythons verdi for «ingenting». Den skrives ut som None, uten fnutter.

Du møter den to steder: som standardsvar fra .get når nøkkelen mangler og du ikke har oppgitt noe annet, og som returverdi fra en funksjon som mangler return — se kap. 1.6. Begge deler er klassiske sporingsfeller, for None er ikke det samme som 0 eller tom streng.

Ordboka i fillesingsoppgaven

Standardoppgaven i Del 8 leser en tekstfil der hver linje har tre felt, og bygger nøyaktig den nøstede ordboka du har sett her — typisk data[stasjon][år] = verdi.

Selve fillesingen legger bare to linjer til mønsteret: åpne fila, og del hver linje i felt. Alt det andre er det du har lært i dette kapitlet. Se kap. 8.1.

Repetisjon — de seks setningene som må sitte

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.

Skolesaga er en uavhengig læringsressurs og er ikke tilknyttet eller godkjent av Universitetet i Oslo. Dette er ikke offisielt studiemateriell. Les mer.