Lister som inneholder lister

Ei liste kan inneholde elementer av alle datatyper. Vi har sett eksempler på lister med heltall, flyttall, strenger og boolske variabler. Men ei liste kan også inneholde andre lister.

Eksempel 1:

Vi har målt maksimumstemperaturen i en by hver dag i tre uker, og har laget følgende oversikt

  Dag 1 Dag 2 Dag 3 Dag 4 Dag 5 Dag 6 Dag 7
Uke 1 12 10 14 7 8 11 10
Uke 2 10 7 9 6 6 8 15
Uke 3 10 5 3 6 4 3 2

Her kan vi representere hver uke som ei liste med 7 elementer i Pyton:

grader_uke_1 = [12, 10, 14, 7, 8, 11, 10]
grader_uke_2 = [10, 7, 9, 6, 6, 8, 15]
grader_uke_3 = [10, 5, 3, 6, 4, 3, 2]

Disse listene kan vi så sette inn i ei ny liste:

grader = [grader_uke_1, grader_uke_2, grader_uke_3]

I Python Tutor ser det slik ut:

Illustrasjon av lister i lister

Vi ser at grader_uke_1, grader_uke_2 og grader_uke_3 refererer til hver si liste, mens grader referer til ei liste som igjen refererer til grader_uke_1, grader_uke_2 og grader_uke_3.

Vi kan for så vidt også opprette grader uten å gå veien om ukelistene:

grader = [[12, 10, 14, 7, 8, 11, 10], [10, 7, 9, 6, 6, 8, 15], [10, 5, 3, 6, 4, 3, 2]]

I eksempel 1 har vi ei liste som inneholder 3 elementer som hver er lister med 7 elementer. For å referere til et enkeltelement må vi da bruke to indekser. Én for å velge ei av listene, og én for å velge et element i denne lista igjen. Indeksene starter på 0, så hvis vi har opprettet grader slik som i eksempel 1, og skriver

print(grader[0][2])

får vi skrevet ut 14 fordi element nummer 0 i grader er lista grader_uke_1, og element nummer 2 i grader_uke_1 er 14.

Generelt vil indeksene [m][n] gi et element med indeks n i lista med indeks m.

Oppgave 1:

Basert på lista grader fra eksempel 1, avgjør hva som blir skrevet ut hvis vi kjører følgende kode:

print(grader[1][2])
print(grader[2][1])
print(grader[0])

Gjør oppgaven på papir først, og sjekk så ved å kjøre koden om du har rett.

Se løsningsforslag

Vil vi gjennomløpe alle elementene i ei liste med lister, må vi ha to nøstede løkker.

Eksempel 2:

Vi har opprettet lista grader som i eksempel 1, og skal finne den høyeste temperaturen i løpet av de tre ukene. Det kan vi gjøre ved hjelp av følgende Python-kode:

# Finner høyeste tall i liste med lister
maks_grader = grader[0][0]  # Startverdi lik dag 1, uke 1
for grader_uke in grader:  # Uke for uke
    for grader_dag in grader_uke:  # Dag for dag i uke
        if grader_dag > maks_grader:
            maks_grader = grader_dag
print(f"Høyeste temperatur var {maks_grader} grader.")

I eksempel 2 tar vi utgangspunkt i temperaturen første dag i første uke, og leter så gjennom resten av lista for å se om vi finner noe høyere. Her bruker vi altså to nøstede løkker. Koden

for grader_uke in grader:

vil tilordne liste for liste fra grader til grader_uke, ei liste for hvert gjennomløp i den ytre løkka.

I den indre løkka vil koden

for grader_dag in grader_uke:

tilordne tall for tall i lista grader_uke til grader_dag, ett tall for hvert gjennomløp i den indre løkka.

Legg merke til at grader_uke i den ytre løkka er ei liste, mens grader_dag i den indre løkka er et tall.

Vi kan ikke bruke Python-funksjonen max() til å finne den høyeste temperaturen. max(grader) vil returnere lista for uka med den høyeste summen av temperaturer i stedet for den høyeste enkelttemperaturen.

Det er ikke noen teoretisk grense for hvor mange lister vi kan ha inni hverandre, men i praksis er det sjelden behov for mer enn 2-3.

Lister som ligger inni ei annen liste, trenger ikke være like store.

Eksempel 3:

Koden under oppretter lista diverse, som inneholder 2 lister med henholdsvis 3 og 5 elementer.

diverse = [[1, 2, 3], [1, 2, 3, 4, 5]]

Kilder

    • Matthes A. (2019). Python Crash Course. no starch press

Den som er vant med å programmere i språk som C, vil kanskje lure på hvorfor vi ikke har pekere i Python. Men ser vi på bildet fra Python Tutor over, skjønner vi at vi har pekere, de er bare implisitte. I eksempel 1 er for eksempel grader en peker til ei liste som inneholder pekere til tre andre lister.