Introduksjon til lister

Ofte har vi bruk for å gruppera variablar som høyrer saman logisk. Hvis vi for eksempel har arrangert ein lengdekonkurranse og skal lagra resultata, så kan vi gjera det på den tungvinte måten ved å definera ein variabel for kvar einaste deltakar, feks slik: resultat1 = 5.25, resultat2 = 5.67, osv. Men kanskje kan det vera lurare å definera resultat som ei liste:

In [1]:
resultat = [5.33, 5.25, 5.67, 5.21, 5.21]

Ei liste er altså eit antal element som er separert med komma, mellom klammeparentesar. Hvis vi seinare treng å finna eit element med index = 3 i lista, så kan vi skriva:

In [2]:
print("Resultatet med index 3 er:",resultat[3])
Resultatet med index 3 er: 5.21

NB! Som vi ser, vi fekk ut det fjerde talet. Det er fordi indeksen startar med 0!

Men no treng vi å utvida lista vår, for det kom plutselig ein deltakar til som hoppa 5.11! Då kan vi bruka metoden append:

In [3]:
resultat.append(5.11)

No kan vi sjekka kva den siste verdien i lista resultat er, ved å bruka index -1:

In [4]:
print("Det siste resultatet er:",resultat[-1])
Det siste resultatet er: 5.11

Vi kan også sjekka om antallet element i lista vår stemmer ved å bruka funksjonen len:

In [5]:
print("Det er no",len(resultat),"resultat i lista vår.")
Det er no 6 resultat i lista vår.

Ein aktuell problemstilling for ein konkurranse er å finna vinnaren, dvs. det lengste hoppet. Det kan vi finna vha. max-funksjonen:

In [6]:
print("Det lengste hoppet er:",max(resultat))
Det lengste hoppet er: 5.67

Men vi veit jo ikkje navnet på vinnaren! Men la oss tenkja oss at vi hadde ei navneliste som tilsvarte resultata slik:

In [7]:
deltakar = ["Abigail", "Anna", "Hannah", "Synne", "Emma", "Madelen"]

Då finn vi navnet på vinnaren på same plass som resultatet 5.67. Vi kan finna indeksen til dette talet vha.:

In [8]:
print("index til resultatet 5.67 er:",resultat.index(5.67))
index til resultatet 5.67 er: 2

Vi kan deretter finna navnet til vinnaren ved å skriva:

In [9]:
deltakar[2]
Out[9]:
'Hannah'

Meir elegant blir det no å slå saman disse kommandoane til ei linje:

In [10]:
print("Vinnaren i lengdekonkurransen er:",deltakar[resultat.index(max(resultat))])
Vinnaren i lengdekonkurransen er: Hannah

Ser du kva som har skjedd her? I den innerste parentesen finn vi det beste resultatet. Så bruker vi det til å finna indeksen til det beste resultatet. Deretter finn vi navnet til deltakaren med denne indeksen!

Resultatliste (for spesielt interesserte!)

No vil vi laga ei resultatliste. Som første forsøk kan vi laga ei løkke som går gjennom alle navna i lista deltakar:

In [11]:
for navn in deltakar:
    print(navn)
Abigail
Anna
Hannah
Synne
Emma
Madelen

Men dette er jo slett ikkje riktig rekkefølge. Så vi er nødt til å laga ei liste med dei korrekte indeksane, sortert etter lista resultat. Vi begynner med å laga ei liste L med alle indeksane:

In [12]:
L = list(range(len(resultat)))
print(L)
[0, 1, 2, 3, 4, 5]

No vil vi bruka funksjonen sorted . Og poenget er at vi må sortera etter rekkefølgen i resultat. Det kan vi få til med kommandoen "key". Så vi lagar først ein funksjon som vi bruker for dette:

In [13]:
def sortfunk(i):
    return resultat[i]

Denne funksjonen bruker vi no til å laga ei ny liste "rekkefolge", der vi sorterer L med minkande rekkefølge (dvs. "reverse = True")

In [14]:
rekkefolge = sorted(L, key = sortfunk, reverse = True)
print("Riktig rekkefølge er:",rekkefolge)
Riktig rekkefølge er: [2, 0, 1, 3, 4, 5]

Då kan vi skriva riktig resultatliste (eller kan vi det?):

In [15]:
nr = 1
print("Resultatliste:")
for i in rekkefolge:
    print(nr,deltakar[i],":",resultat[i])
    nr += 1
Resultatliste:
1 Hannah : 5.67
2 Abigail : 5.33
3 Anna : 5.25
4 Synne : 5.21
5 Emma : 5.21
6 Madelen : 5.11

Ja, dette er riktig, med ett unntak: Synne og Emma har samme resultat, og skal dermed dela fjerdeplassen. Det kan vi få til med følgande kode:

In [16]:
print("Riktig resultatliste!")
nr = 1
forrigeresultat = 0
forrigenr = -1
for i in rekkefolge:
    if resultat[i] == forrigeresultat:
        skrivnr = forrigenr #Delt plassering, samme nr som forrige
    else:
        skrivnr = nr #nr i lista
    print(skrivnr,deltakar[i],":",resultat[i])
    forrigeresultat = resultat[i]
    forrigenr = skrivnr
    nr += 1
Riktig resultatliste!
1 Hannah : 5.67
2 Abigail : 5.33
3 Anna : 5.25
4 Synne : 5.21
4 Emma : 5.21
6 Madelen : 5.11