3.1 Lister

Lister: indeksering (også negativ), `append`, gjennomløping, `len` og bygging av nye lister — den mest brukte datastrukturen i hele faget.

45 min
8 oppgaver
Lister
Din fremgang i kapitlet
0 / 8 oppgaver
Kapitlets plass i kurset

Forkunnskaper — sist du var her

Kap. 1.3 — Løkker: for, while og range og
kap. 2.1 — Funksjoner: def, parametere og return.

De tre tingene du bruker mest her:

- teller- og akkumulatormønsteret: startverdi før løkka, oppdatering inne i
den, bruk etter,
- range(start, stopp, steg), og at stoppverdien aldri er med,
- flagg med tidlig retur: return False ved første moteksempel inne i
løkka, return True etter løkka.

Kort oppfrisket, med en tekst som data:

antall = 0 for tegn in "resirkulering":
    if tegn == "r":
        antall = antall + 1 print(antall)

Utskrift:

3

I dette kapitlet bytter vi ut teksten med en liste. Løkka ser nesten nøyaktig lik ut — men lista kan inneholde hva som helst, ikke bare enkelttegn, og den kan endres underveis.

Løkke 1 — Hva en liste er, og hvordan du henter ut ett element (~12 min)

En sykkelutleie har fem stativer, og teller hvor mange ledige sykler som står i hvert av dem. Fem tall hører sammen. Du kunne gitt dem fem variabelnavn, men da måtte du skrevet fem linjer for å legge dem sammen — og ti linjer hvis stativene ble ti.

En liste samler dem i én verdi, som du kan gå gjennom med én løkke uansett hvor mange de er.

Liste

En verdi som holder flere andre verdier i en bestemt rekkefølge.

Du skriver den med hakeparenteser og komma mellom elementene:

ledige = [4, 7, 12, 9, 3]
print(ledige)

Utskrift:

[4, 7, 12, 9, 3]

Tre egenskaper er verdt å merke seg med én gang. Rekkefølgen er fast — det fjerde tallet blir værende det fjerde. Lista kan endres etter at den er laget, i motsetning til en tekst. Og den kan vokse: du kan legge til nye elementer underveis.

Et enkelt element i lista kalles et element, og plassen det står på, kalles en indeks.

`[...]` — listelitteral og tom liste

En liste skrevet rett inn i koden. Den kan være tom, og elementene trenger ikke være av samme type:

tomme = []
blandet = [3, "buss", True]
print(tomme, len(tomme))
print(blandet)

Utskrift:

[] 0
[3, 'buss', True]

Den tomme lista [] er ikke en kuriositet — den er startpunktet i det viktigste listemønsteret i faget: du begynner med en tom liste og fyller den underveis.

Legg merke til at teksten buss vises med enkle anførselstegn når hele lista skrives ut. Det er slik Python viser strenger inne i en liste, og det er et detaljspørsmål som avgjør poeng i et auto-rettet svarfelt.

`len(liste)`

Gir antall elementer i lista, som et heltall:

dager = ["mandag", "tirsdag", "onsdag"]
print(len(dager))
print(len(dager) - 1)
print(dager[len(dager) - 1])

Utskrift:

3
2 onsdag

Legg merke til de to første linjene. Lengden er 3, men den siste indeksen er
2.
Den forskjellen på én er kilden til feilkode #5, av-med-én, og den skal du
møte igjen hver gang du skriver range(len(...)).

len virker også på tekster, akkurat som du så i forkunnskapene.

Indeksering `liste[i]`

Henter ut elementet som står på plass i. Tellingen starter på null:

plasser = [12, 8, 5, 20]
print(plasser[0])
print(plasser[2])
print(plasser[0] + plasser[2])

Utskrift:

12
5
17

Det første elementet har indeks 0, det andre har indeks 1, og det siste har indeks len(liste) - 1. Å blande «det andre elementet» med «indeks 2» er den vanligste kilden til feil svar i en sporingsoppgave.

Uttrykket plasser[2] er en helt vanlig verdi. Du kan regne med den, sende den til en funksjon eller sammenligne den, akkurat som med en variabel.

Negativ indeks `liste[-1]`

Teller bakfra. -1 er det siste elementet, -2 det nest siste:

plasser = [12, 8, 5, 20]
print(plasser[-1], plasser[-2])
print(plasser[3] == plasser[-1])

Utskrift:

20 5
True

Merk at det ikke finnes noen -0; null teller forfra. Formen liste[-1] er praktisk fordi du slipper å regne ut lengden først, og den brukes flittig i fagets løsningsforslag.

✏️Eksempel 1: Fem stativer, lest ut ett og ett

Sykkelutleien har fem stativer med henholdsvis 4, 7, 12, 9 og 3 ledige sykler.
Skriv ut hele oversikten, antall stativer, det første og det fjerde tallet, det siste tallet, og summen av det første og det fjerde.

Alt hentes ut av den samme lista:

ledige = [4, 7, 12, 9, 3]
print(ledige)
print(len(ledige))
print(ledige[0], ledige[3])
print(ledige[-1])
print(ledige[0] + ledige[3])

Utskrift:

[4, 7, 12, 9, 3]
5
4 9
3
13

Tre ting er verdt å legge merke til.

Det fjerde tallet har indeks 3. Oppgaveteksten teller fra én, som mennesker
gjør; Python teller fra null. Den oversettelsen må du gjøre bevisst hver gang.

print(ledige) viser hakeparentesene og komma med mellomrom etter. I et
auto-rettet felt er [4, 7, 12, 9, 3] riktig og 4 7 12 9 3 galt.

print(ledige[0], ledige[3]) gir derimot ingen hakeparenteser — der er det
to enkeltverdier skilt av ett mellomrom, som ved alle andre print med komma.

📝Oppgave 1

(Innstegsoppgave — ren gjengivelse.) En kollektivrute har disse stoppene:

stopp = ["Majorstuen", "Nationaltheatret", "Jernbanetorget"]

a) Hva gir len(stopp)?

b) Hva gir stopp[1]?

c) Hva gir stopp[-1]?

d) Hvilken indeks har det første stoppet?

e) Hva skjer hvis du skriver stopp[3]?

📝Oppgave 2
Eksamensnivå, sjanger A

Hva skriver programmet ut? Skriv utskriften nøyaktig, med mellomrom og linjeskift slik terminalen viser den.

maal = [2, 0, 1, 4]
print(maal[0], maal[-1])
print(maal[1] + maal[2])
print(len(maal))
print(maal)

Løkke 2 — Å gå gjennom en liste (~12 min)

Nå kommer selve arbeidshesten. Det finnes to måter å løpe gjennom en liste på, og de brukes til hver sine ting. Du skal kunne begge, og du skal kunne velge riktig — det er et av de få stedene i faget der valget er verdt poeng.

`for e in liste:`

Går gjennom lista element for element. Løkkevariabelen får verdien til elementet, ikke plassen:

priser = [30, 45, 20]
total = 0 for pris in priser:
    total = total + pris print(total)

Utskrift:

95

Dette er den formen du skal bruke når du bare trenger verdiene. Den er kortere, den kan ikke bomme på grensene, og den er det fagets løsningsforslag velger når de kan.

Legg merke til at den ser nøyaktig ut som løkka over en tekst i forkunnskapene.
Forskjellen er bare hva elementene er.

`for i in range(len(liste)):`

Går gjennom plassene i stedet for verdiene. Løkkevariabelen i er en indeks, og du henter selv ut elementet:

priser = [30, 45, 20]
for i in range(len(priser)):
    print(i, priser[i])

Utskrift:

0 30
1 45
2 20

range(len(priser)) gir tallene 0, 1 og 2 — nøyaktig de lovlige indeksene, og ikke én mer. Det er derfor formen er trygg akkurat slik den står.

Bruk den bare når du faktisk trenger plassen: når du skal skrive tilbake til
lista, når du skal sammenligne to naboelementer, eller når du skal hoppe over annethvert. Trenger du bare verdiene, er for e in liste: bedre.

`e in liste`

Svarer True eller False på om verdien finnes i lista:

linjer = ["31", "20", "37"]
print("20" in linjer)
print("21" in linjer)
print(20 in linjer)

Utskrift:

True
False
False

Siste linje er fellen. Tallet 20 og teksten "20" er ikke samme verdi, så testen svarer False selv om det «ser riktig ut». Det er den samme type-forvekslingen som i feilkode #3.

in er praktisk i en betingelse, men den forteller deg bare om verdien finnes — ikke hvor. Trenger du plassen, må du telle deg fram selv med en løkke.

✏️Eksempel 2: Samme telling, to løkkeformer

Et bibliotek registrerer hvor mange ganger fem bøker har vært utlånt:
[3, 0, 7, 0, 5]. Tell hvor mange av bøkene som aldri har vært utlånt, først med en løkke over verdiene og deretter med en løkke over indeksene. Hvilken av dem ville du levert på eksamen?

Begge gir samme svar. Forskjellen er hva løkkevariabelen betyr:

utlan = [3, 0, 7, 0, 5]

antall = 0 for tall in utlan:
    if tall == 0:
        antall = antall + 1 print(antall)

antall_med_indeks = 0 for i in range(len(utlan)):
    if utlan[i] == 0:
        antall_med_indeks = antall_med_indeks + 1 print(antall_med_indeks)

Utskrift:

2
2

Den første ville jeg levert. Den sier hva den gjør uten omveier, og den kan
ikke bomme på grensene. Den andre må først slå opp utlan[i] for å komme til den samme verdien.

Slik ville sensor sett på det: begge gir full uttelling. Riktig svar og
riktig struktur er det som teller — men den første formen har færre steder å gjøre feil, og det er verdt noe i seg selv når du skriver på papir uten å kunne prøve koden.

Trengte oppgaven derimot å vite hvilken bok som aldri var utlånt, måtte du brukt indeksformen. Da er plassen selve svaret.

📝Oppgave 3
Eksamensnivå, sjanger A

Hva skriver programmet ut?

tall = [3, 6, 9, 12]
total = 0 for i in range(1, len(tall)):
    total = total + tall[i]
print(total)

📝Oppgave 4
Eksamensnivå, sjanger C

Skriv funksjonen
antall_over(tallene, grense) som returnerer hvor mange av tallene i lista som er strengt større enn grensen.

a) Skriv funksjonen med tellermønsteret.

b) Hva returnerer antall_over([], 5), og hvorfor?

c) Hva ville endret seg hvis oppgaven sa «minst like stor som grensen»?

Løkke 3 — Å endre en liste og bygge en ny (~13 min)

En liste kan endres etter at den er laget. Det er den store forskjellen fra en tekst, og det er grunnen til at lista er byggematerialet i den store klassemodelleringen: et objekt kan holde en liste som vokser mens programmet kjører.

`liste.append(e)`

Legger til ett nytt element bakerst i lista. Lista endres på stedet — det lages ingen ny:

ledige = []
ledige.append(4)
ledige.append(9)
print(ledige, len(ledige))

Utskrift:

[4, 9] 2

Legg merke til formen: append skrives etter lista med et punktum mellom.
Det er en metode — en funksjon som hører til verdien den står bak. Du møter samme skrivemåte igjen på tekster og på dine egne klasser senere i boka.

append returnerer ingenting. Skriver du ledige = ledige.append(4), mister du hele lista og sitter igjen med None. Det er en klassisk nybegynnerfeil, og den er stum til du prøver å bruke resultatet.

`liste[i] = ny_verdi`

Bytter ut elementet på plass i. Lista må allerede ha en verdi der:

plasser = [12, 8, 5]
plasser[1] = 99 print(plasser)

Utskrift:

[12, 99, 5]

Dette er den ene tingen du trenger indeksløkka til: skal du endre lista mens du går gjennom den, må du vite hvilken plass du er på. En løkke av formen
for e in liste: gir deg bare en kopi av verdien, og å tilordne til e endrer ingenting i lista.

Merk forskjellen fra append: tilordning bytter ut noe som finnes, mens
append gjør lista én lengre.

📜Bygg-en-ny-liste-mønsteret

Bokas fjerde kodemønster, og standardsvaret på enhver oppgave som ber om «en ny liste med …».

Oppskriften har tre faste steg:

1. Før løkka: lag en tom liste, ny = [].
2. Inne i løkka: legg til det som skal være med, med ny.append(...).
3. Etter løkka: return ny.

tall = [4, 11, 7, 20]
store = []
for t in tall:
    if t > 9:
        store.append(t)
print(store)

Utskrift:

[11, 20]

Det er nøyaktig samme skjelett som akkumulatormønsteret fra
kap. 1.3 — bare med en tom liste i stedet for en nullstilt teller. Startverdi før, oppdatering inne, bruk etter.

Mønsteret dekker tre oppgavetyper som ser ulike ut: filtrere (ta med noen),
omforme (ta med alle, men endret) og kombinere (bygge nye verdier av
gamle). Kjenner du igjen skjelettet, er alle tre den samme oppgaven.

`+` på lister

Skjøter to lister til en ny liste. De opprinnelige er urørt:

a = [1, 2]
b = [3]
print(a + b)
print(a)

Utskrift:

[1, 2, 3]
[1, 2]

Plusstegnet gjør altså det samme på lister som på tekster: det setter dem etter hverandre. Det legger ikke sammen elementene parvis — [1, 2] + [3, 4] gir
[1, 2, 3, 4], ikke [4, 6].

✏️Eksempel 3: En funksjon som bygger en ny liste

Skriv annethvert(liste) som returnerer en ny liste med elementene som står på partallsindeks — altså 0, 2, 4 og så videre. Vis også hva funksjonen gjør med en tom liste og med en liste som har bare ett element.

Her trenger du plassene, ikke verdiene, så indeksløkka er riktig valg — og
range med steg gjør hoppingen for deg:

def annethvert(liste):
    ny = []
    for i in range(0, len(liste), 2):
        ny.append(liste[i])
    return ny

print(annethvert([10, 20, 30, 40, 50]))
print(annethvert([]))
print(annethvert(["a"]))

Utskrift:

[10, 30, 50]
[]
['a']

Slik ville sensor sett på det: tre ting gir uttelling hver for seg.

Den ene er at du lager en ny liste i stedet for å prøve å fjerne annethvert element fra den gamle. Den andre er at range(0, len(liste), 2) treffer nøyaktig de lovlige indeksene — stoppverdien er len(liste), som selv aldri er en lovlig indeks, og det er nettopp derfor det stemmer. Den tredje er at funksjonen returnerer lista, i stedet for å skrive den ut.

De to siste kallene viser kanttilfellene. En tom liste gir en tom liste, og en liste med ett element gir det ene elementet — begge deler faller ut av mønsteret uten en eneste ekstra if. Det er slik du vil ha det: kant-tilfellene skal helst løses av strukturen, ikke av lappverk.

📝Oppgave 5
Eksamensnivå, sjanger C

En kantine registrerer prisene på dagens retter i en liste. Skriv funksjonen med_rabatt(priser, kroner) som returnerer en ny liste der kroner er trukket fra hver pris.

a) Skriv funksjonen.

b) Hva skjer med den opprinnelige lista når funksjonen kalles?

c) Hvorfor ville det vært galt å skrive return priser til slutt?

📝Oppgave 6
Eksamensnivå, sjanger A

Hva skriver programmet ut?

liste = [1, 2, 3]
ny = []
for e in liste:
    ny.append(e * 2)
liste[0] = 99 print(liste)
print(ny)
print(liste + ny)

Løkke 4 — Lister i en sporingsoppgave (~10 min)

Lister dukker like ofte opp i Oppgave 1 som i Oppgave 3, og da er spørsmålet ikke hva du kan skrive, men om du kan lese. To detaljer avgjør nesten alle slike oppgaver: hvordan en liste ser ut når den skrives ut, og nøyaktig hvilke indekser løkka treffer.

Utskrift av en liste
print(liste) viser hakeparentesene, komma og ett mellomrom mellom elementene
— og strenger vises med enkle anførselstegn:

blandet = [1, "to", 3.0, True]
print(blandet)
print(blandet[1])
print(blandet[2])

Utskrift:

[1, 'to', 3.0, True]
to
3.0

Merk de tre forskjellene mellom første og andre linje. Hele lista får hakeparenteser; ett element får ikke. Teksten inne i lista får anførselstegn;
den samme teksten skrevet ut alene får ikke. Og desimaltallet 3.0 beholder punktum og null begge steder — det er en float, og det er ikke det samme som
3.

I et auto-rettet svarfelt er alle tre forskjellene forskjellen på rett og galt.

✏️Eksempel 4: En full sjanger A-oppgave med liste, sporet linje for linje

Hva skriver dette programmet ut?

tall = [5, 3, 8, 1]
resultat = []
i = 0 while i < len(tall):
    if tall[i] > tall[0]:
        resultat.append(tall[i])
    i = i + 2 print(resultat, len(resultat))
print(tall[-1] + tall[1])

Bruk sporingstavle. Legg merke til at løkkevariabelen øker med 2.

Først tavla. Lengden er 4, så løkka går så lenge i er under 4:

i ved starttall[i]Større enn tall[0] = 5?resultat etter rundeni etter runden
05nei[]2
28ja[8]4
4løkka stopper[8]4

Så de to utskriftslinjene. Den første viser lista og lengden; den andre henter siste element (1) og elementet på indeks 1 (3).
tall = [5, 3, 8, 1]
resultat = []
i = 0 while i < len(tall):
    if tall[i] > tall[0]:
        resultat.append(tall[i])
    i = i + 2 print(resultat, len(resultat))
print(tall[-1] + tall[1])
Utskrift:
[8] 1
4

Tre feller i én oppgave. Den første er at tall[0] sammenlignes med seg selv

i første runde, og 5 > 5 er usann — kantverdien igjen. Den andre er steget på

2, som gjør at indeks 1 og 3 aldri besøkes. Den tredje er at
print(resultat, len(resultat)) blander en liste og et tall på samme linje, så svaret er [8] 1 med hakeparenteser rundt det ene og ingenting rundt det andre.

Margnotat om uttelling: har du ført tavla riktig, men skrevet 8 1 uten
hakeparenteser til slutt, er sporingen di korrekt og bare formen feil. I et auto-rettet felt gir det likevel null poeng — så skriv utskriften slik terminalen ville vist den, hver gang.

📝Oppgave 7
Eksamensnivå, sjanger A

Hva skriver programmet ut? Skriv utskriften nøyaktig, med mellomrom og linjeskift slik terminalen viser den.

verdier = [4, 8, 15, 16]
resultat = []
for i in range(len(verdier) - 1):
    resultat.append(verdier[i + 1] - verdier[i])
print(resultat)
print(len(resultat), verdier[-1])

📝Oppgave 8
Eksamensnivå, sjanger C

En værstasjon lagrer døgnets målinger i en liste med heltall. Skriv funksjonen storste_verdi(tallene) som returnerer den største verdien i lista.

a) Skriv funksjonen. Den skal returnere None hvis lista er tom.

b) Hvorfor er beste = 0 en dårlig startverdi?

c) Hva returnerer funksjonen din for [7, 7, 7]?

API- og konstruksjonsliste

Begrepsbank

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

Element

En enkeltverdi i lista. I [4, 7, 12] er 4, 7 og 12 de tre elementene.

Elementene trenger ikke ha samme type, men i praksis har de nesten alltid det — en liste med målinger inneholder tall, og en liste med stoppesteder inneholder tekster. Blandede lister forekommer, men de er vanskeligere å skrive kode for, fordi du ikke vet hva du får.

Senere i boka blir elementene objekter du selv har laget, og det er nettopp da lista blir kraftig.

Indeks

Plassen et element står på, talt fra null.

Det gir tre tall som er lette å blande, og som du bør si høyt for deg selv:
lengden er antallet, den første indeksen er 0, og den siste indeksen er
len(liste) - 1.

En indeks er alltid et heltall. Skriver du liste[1.0] eller liste["1"], stopper programmet — indeksen må være av riktig type.

Lengde mot siste indeks

Den ene forskjellen som produserer flest gale svar i faget.

For lista [10, 20, 30] er lengden 3, mens den siste indeksen er 2. Derfor er liste[len(liste)] alltid en feil, mens liste[len(liste) - 1] alltid er det siste elementet — det samme som liste[-1].

Den samme forskjellen er grunnen til at range(len(liste)) treffer nøyaktig de lovlige indeksene: range stopper før stoppverdien.

`IndexError`

Feilmeldingen Python gir når du ber om en plass som ikke finnes. Siste linje lyder IndexError: list index out of range.

Den kommer nesten alltid fra ett av tre steder: en indeks som er én for stor, en løkke som går én runde for langt, eller en liste som viste seg å være tom.

I en sporingsoppgave er «programmet stopper med en feilmelding» et fullgodt svar
— men du bør kunne peke på hvilken linje som feiler.

Tom liste

Lista [], med lengde 0.

Den er ikke en spesialtilfelle du kan overse. En løkke over en tom liste kjører
null runder, så alt du gjorde før løkka, står uendret når du kommer til
linja etter. Det er derfor teller- og bygg-mønstrene håndterer tomme lister av seg selv.

Det som ikke går av seg selv, er å indeksere. liste[0] på en tom liste stopper programmet, og det er hele grunnen til at tomsjekken står øverst i finn-beste-funksjoner.

Å bygge en liste

Å starte med ny = [] og legge til med append i en løkke.

Mønsteret dekker tre oppgavetyper som ser forskjellige ut i teksten: filtrere
(«en ny liste med bare de som …»), omforme («en ny liste der hvert element er …») og kombinere («en ny liste med differansene mellom …»).

Kjenn igjen skjelettet, så er alle tre den samme oppgaven: tom liste før,
append inne, return etter.

To navn på samme liste

Skriver du b = a når a er en liste, får du ikke en kopi. Du får et navn til på den samme lista, og en endring gjennom det ene navnet sees gjennom det andre:

a = [1, 2]
b = a b.append(3)
print(a)
print(b)

Utskrift:

[1, 2, 3]
[1, 2, 3]

Dette er feilkode #15, og det er et av de vanskeligste punktene i faget. Tall og tekster oppfører seg annerledes — der gir b = a i praksis to uavhengige verdier.

Hele mekanismen har et navn, referanser, og den får en grundig gjennomgang i del 5 om klasser og objekter. Her holder det å vite at en liste ikke kopieres av et likhetstegn.

Sekvens

Fellesordet for verdier som har elementer i rekkefølge, og som du kan gå gjennom med for e in ...:. Både lister og tekster er sekvenser.

Det er derfor så mye av det du lærte om tekster, virker uendret på lister:
len(...), indeksering med hakeparentes, negativ indeks og in-testen oppfører seg likt.

Den store forskjellen er at en liste kan endres, mens en tekst ikke kan. Du kan skrive liste[0] = 9, men tekst[0] = "a" stopper programmet.

Liste som parameter

En liste kan sendes inn i en funksjon som et hvilket som helst annet argument:
def antall_over(tallene, grense):.

Inne i funksjonen er tallene et navn på den samme lista som utenfor, ikke en kopi. Leser du bare fra den, spiller det ingen rolle. Kaller du derimot
tallene.append(...), endrer du kallerens liste også — og det er sjelden det du vil på eksamen.

Den trygge stilen er den du har brukt her: les fra lista du fikk inn, bygg en
ny liste, og returner den nye.

Å finne plassen selv
in-testen forteller om en verdi finnes, men ikke hvor. Trenger du plassen, teller du deg fram med indeksløkka og returnerer indeksen ved første treff:

def plassen_til(liste, verdi):
    for i in range(len(liste)):
        if liste[i] == verdi:
            return i return -1

print(plassen_til([9, 4, 7], 7))
print(plassen_til([9, 4, 7], 5))

Utskrift:

2
-1

Verdien -1 for «ikke funnet» kalles en sentinel-verdi — en verdi som betyr noe annet enn de vanlige. Den er trygg her, fordi en plass aldri kan være negativ. Er -1 derimot gyldige data, kolliderer de to betydningene, og da er
None det bedre valget. Det er feilkode #10.

Blandede typer i en liste

En liste kan inneholde tall, tekster og boolske verdier om hverandre:
[3, "buss", True].

Python tillater det, men koden din må tåle det. En løkke som legger sammen elementene, stopper i det den treffer teksten — og feilmeldingen dukker opp midt i løkka, ikke der lista ble laget.

I praksis holder du typene ensartede, og lar i stedet en klasse holde sammen opplysninger av ulik art. Det er hele poenget med objektorientering, og det er dit boka er på vei.

Utsnitt av en liste

Formen liste[1:3] gir en ny liste med elementene fra indeks 1 til og med
2 — stoppverdien er eksklusiv, som i range.

Konstruksjonen kalles et utsnitt, og den nevnes her fordi du vil se den i kode andre har skrevet. Denne boka bruker den ikke, og eksamensoppgavene krever den ikke: fasitens svar på «de tre første» er en løkke med range(0, 3) og append.

Lærer du utsnitt før du behersker løkka, får du et verktøy uten det håndverket kurset faktisk måler.

Å velge løkkeform

Spørsmålet er alltid det samme: trenger du plassen?

Trenger du bare verdiene — telle, summere, sjekke, bygge en ny liste — skriver du for e in liste:. Trenger du plassen — skrive tilbake til lista, sammenligne naboer, hoppe over annethvert, eller returnere hvor noe sto — skriver du
for i in range(len(liste)):.

Begge gir full uttelling når svaret er riktig. Men den første kan ikke bomme på grensene, og på en hjelpemiddelfri eksamen er det et reelt argument.

Rekkefølge betyr noe

En liste husker rekkefølgen elementene ble lagt inn i, og append legger alltid til bakerst.

Det gjør lista til riktig valg når rekkefølgen er en del av dataene: køen på sykkelutleien, stoppene langs ruta, målingene time for time.

Skal du derimot slå opp på en nøkkel — «hvor mange ganger forekom dette ordet?», «hvem eier denne boka?» — er lista feil verktøy. Da trenger du en ordbok, og det er neste kapittel.

Repetisjon — de sju 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.