Lær å organisere og håndtere samlinger av data ved hjelp av lister, ordbøker og andre sentrale datastrukturer.
Når én boks ikke er nok
Hittil har variablene våre holdt på én ting hver: ett tall, ett navn, én sannhetsverdi. Men virkeligheten kommer sjelden i porsjoner på én. Du har ikke én elev i klassen, men tjuefem. Ikke én film du liker, men en hel liste. Ikke ett faktum om deg selv, men mange -- navn, alder, klasse, fag. Hvordan skal programmet ditt holde styr på samlinger av data?
Svaret er datastrukturer -- smarte beholdere som kan romme mange verdier på en gang, organisert på ulike måter. I stedet for hundre enkeltvariabler, samler du dataene i én struktur du kan jobbe med samlet. Det er forskjellen på å ha hundre løse ark spredt utover, og å ha dem ryddig i en perm.
I denne fortellingen skal vi bli kjent med de viktigste datastrukturene i Python. Vi skal mestre listen, som holder ting i en ordnet rekke. Vi skal oppdage ordboken, som lar oss slå opp verdier ved hjelp av navn. Og vi skal møte tuppelen, en urørlig slektning av listen. Til slutt skal vi lære når vi bør velge hvilken -- for å velge riktig beholder er en kunst i seg selv.
Listen -- en ordnet rekke
Den mest grunnleggende datastrukturen er listen. Den er en ordnet samling av verdier, skrevet inni hakeparenteser. For eksempel elever = ["Anna", "Bjørn", "Camilla"]. Det fine med en liste er at hvert element har en fast plass, og at du kan endre listen etter at den er laget -- legge til, fjerne og bytte ut.
For å hente et element bruker du indeks, altså posisjonsnummeret. Men her er en viktig regel: Python begynner å telle på null. Så elever[0] er «Anna», elever[1] er «Bjørn». Et nyttig triks er å bruke negative tall: elever[-1] gir det siste elementet, «Camilla», uansett hvor lang listen er. Det å starte på 0 forvirrer nesten alle i begynnelsen, så det er verdt å feste seg godt.
Lister har mange nyttige innebygde metoder. Med elever.append("David") legger du til et element på slutten. Med elever.remove("Bjørn") fjerner du et. Funksjonen len(elever) forteller hvor mange elementer listen har. Og har du en liste med tall, kan tall.sort() ordne dem stigende. Til slutt finnes et elegant verktøy som kalles listeforståelse, som lar deg bygge en ny liste på én linje: kvadrater = [x**2 for x in range(1, 6)] gir listen [1, 4, 9, 16, 25]. Det er kompakt, kraftig og typisk Python.
Ordboken -- et oppslagsverk
Lister er flotte når rekkefølge betyr noe, men noen ganger vil vi heller slå opp verdier ved hjelp av et navn enn et tall. Tenk på en vanlig ordbok: du slår ikke opp ord nummer 4372, du slår opp ordet «hund» og får forklaringen. Akkurat dette gjør datastrukturen ordbok, eller dict på Python-vis.
En ordbok lagrer nøkkel-verdi-par inni krøllparenteser. For eksempel elev = {"navn": "Kari", "alder": 16, "klasse": "1IMA"}. Her er «navn», «alder» og «klasse» nøkler, og «Kari», 16 og «1IMA» er verdiene. For å hente en verdi bruker du nøkkelen i stedet for et tall: elev["navn"] gir «Kari». Det er langt mer lesbart enn å huske at navnet ligger på indeks 0.
Ordbøker kan også endres. Med elev["skole"] = "VGS" legger du til et nytt par. Og vil du gå gjennom hele ordboken, finnes en fin metode: for nokkel, verdi in elev.items(): lar deg løpe over alle parene og for eksempel skrive ut «navn: Kari», «alder: 16» og så videre. Ordbøker er perfekte når data naturlig hører sammen med en etikett -- en elev med sine egenskaper, en vare med pris og lagerstatus, eller et ord med antall forekomster i en tekst.
Tuppelen -- den urørlige
Det finnes en tredje datastruktur som ligner mye på listen, men med én avgjørende forskjell: tuppelen kan ikke endres etter at den er laget. Mens en liste skrives med hakeparenteser, skrives en tuppel med vanlige parenteser, for eksempel koordinat = (10, 20).
Du henter ut verdier på samme måte som i en liste, med indeks: koordinat[0] gir 10. Du kan til og med gjøre noe smart som kalles utpakking: skriver du x, y = koordinat, får x verdien 10 og y verdien 20 i én operasjon. Men forsøker du å endre en tuppel etter at den er laget, sier Python nei. Den er låst, urørlig, fast.
Hvorfor i all verden vil vi ha noe vi ikke kan endre? Fordi det noen ganger er en fordel. Når du har data som skal være faste -- som koordinatene til et punkt, ukedagene, eller fargekanalene i RGB -- gir tuplen en garanti om at ingen ved et uhell roter dem til. En enkel huskeregel oppsummerer valget: bruk lister for data som skal kunne endres, og tupler for verdier som skal stå fast. Selve fastheten er poenget.
Å sette strukturene i arbeid
Det er når vi kombinerer disse strukturene og verktøyene at de virkelig blir kraftige. La oss se på noen typiske oppgaver der datastrukturene skinner.
Tenk deg at du leser inn fem tall fra brukeren og samler dem i en liste. Da har du plutselig tilgang til en hel verktøykasse av innebygde funksjoner: max(tall) gir det største, min(tall) det minste, og sum(tall) / len(tall) gir gjennomsnittet. Det som ville krevd mange linjer manuelt, blir tre korte kall. Listen lar deg behandle hele datamengden under ett.
Og så det virkelig elegante: å telle ting. Si at du vil telle hvor mange ganger hvert ord forekommer i en setning. Du bruker split() for å dele setningen opp i en liste av ord, og en ordbok for å holde tellingen. For hvert ord sjekker du: finnes det allerede i ordboken? Hvis ja, øk telleren med én; hvis nei, sett den til 1. Til slutt går du gjennom ordboken og skriver ut hvert ord med antallet. Her samarbeider listen, ordboken og løkken i en vakker liten dans. Dette mønsteret -- å telle forekomster i en ordbok -- dukker opp overalt i ekte programmering, fra å analysere tekst til å lage statistikk. Velger du riktig datastruktur, løser oppgavene seg nesten av seg selv.
Oppsummering
Vi har lært å romme mange verdier i én struktur. Lister er ordnede, foranderlige samlinger i hakeparenteser, der vi henter elementer med indeks fra 0 (og bakfra med negative tall) og bruker metoder som .append(), .remove() og .sort() -- pluss elegant listeforståelse. Ordbøker lagrer nøkkel-verdi-par i krøllparenteser og lar oss slå opp verdier ved navn i stedet for nummer. Tupler er som lister, men urørlige, og passer for faste verdier.
Viktigst av alt er å velge riktig beholder: lister for ordnede, foranderlige data, ordbøker for oppslag, og tupler for det som skal stå fast. Og når vi kombinerer strukturene med innebygde funksjoner som max(), min(), sum() og split(), løser selv kompliserte oppgaver -- som å telle ord i en tekst -- seg nesten av seg selv.
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.