Løsningsforslag, lister og dictionaries

Lister

Oppgave 1:

Vi har lista demo, som ser slik ut:

demo
"a" "b" "c" "d" "e"
Så skal vi avgjøre hvordan lista vil se ut etter at vi har kjørt følgende kode i Python:

demo[1] = demo[2]
demo[3] = demo[4]

Vi husker at indeksering starter på 0, så elementet med indeks 1 er "b", elementet med indeks 2 er "c", elementet med indeks 3 er "d", og elementet med indeks 4 er "e".

Så først erstattes "b" med "c", og lista ser slik ut:

demo
"a" "c" "c" "d" "e"
Deretter erstattes "d" med "e", og lista ser slik ut:
demo
"a" "c" "c" "e" "e"

Vi kontrollerer ved å skrive kode som først oppretter demo, deretter gjør endringene, og til slutt skriver demo ut:

demo = ["a", "b", "c", "d", "e"]
demo[1] = demo[2]
demo[3] = demo[4]
print(demo)0

Vi får skrevet ut ['a', 'c', 'c', 'e', 'e'].

Tilbake til oppgaven

Oppgave 2:

Vi har lista demo, med 5 elementer, og skal forklare hvorfor vi får feilmeldingen "IndexError: list index out of range" når vi skriver

print(demo[5])

Siden indeksering starter på 0, refererer demo[5] til et sjette element som ikke finnes, og vi får derfor en feilmelding.

Tilbake til oppgaven

Oppgave 3:

Vi oppretter variabelen diverse slik:

diverse = [3, "2", 1.0]

Så skal vi avgjøre hvilken datatype følgende da har:

    • diverse. Dette er ei liste.
    • diverse[0]. Dette er element 0 i lista diverse, som er et heltall.
    • diverse[1]. Dette er element 1 i lista diverse, som er en streng.
    • diverse[2]. Dette er element 2 i lista diverse, som er et flyttall.

For å sjekke kjører vi koden

diverse = [3, "2", 1.0]
print(type(diverse))
print(type(diverse[0]))
print(type(diverse[1]))
print(type(diverse[2]))

Tilbake til oppgaven

Opprette lister

Oppgave 1:

Vi skal skrive kode for å opprette følgende:

    • Ei liste som heter lottotrekning og inneholder tallene 2, 9, 10, 15, 16, 22 og 26.
    • Ei liste som heter basis og inneholder 10 tall som alle er lik 1.
    • Ei liste som heter hurra og inneholder 3 strenger som alle er "hipp".
    • Ei liste som heter lottotall og inneholder tallene fra og med 1 til og med 34.

Etterpå skal vi bruke print() for å sjekke at listene er blitt riktige.

I lottotrekning er det ikke noe system i tallene, så vi må opprette lista ved å ramse opp innholdet:

lottotrekning = [2, 9, 10, 15, 16, 22]

I basis skal alle tallene være lik 1, så vi kan opprette lista ved å angi et element som er 1, og så indikere at dette skal gjentas 10 ganger:

basis = [1] * 10

hurra følger samme mønster som basis, så vi skriver:

hurra = ["hipp"] * 3

I lottotall skal tallene være en følge fra 1 til 34, så lista kan vi opprette ved å bruke list() og range():

lottotall = list(range(1, 35))

For å sjekke innholdet, skriver vi

print(lottotrekning)
print(basis)
print(hurra)
print(lottotall)

Tilbake til oppgaven

Liste-metoder

Oppgave 1:

Vi skal skrive Python-kode som oppretter lista demo, som ser slik ut:

demo
7 -3 8 4 8

Deretter skal vi skrive Python-kode som

    • Legger til 9 på slutten.
    • Setter inn −4 foran elementet med indeks 3.
    • Fjerner og skriver ut elementet med indeks 1.
    • Fjerner elementet med verdi 4.
    • Utvider lista med lista [6, 3, 5].

Vi oppretter først lista

demo = [7, -3, 8, 4, 8]

For å legge til 9 på slutten skriver vi

demo.append(9)

For å sette inn −4 foran elementet med indeks 3 skriver vi

demo.insert(3, -4)

For å fjerne og skrive ut elementet med indeks 1 skriver vi

print(demo.pop(1))

For å fjerne verdien 4 skriver vi

demo.remove(4)

For å utvide lista med lista [6, 3, 5] skriver vi

demo.extend([6, 3, 5])

<eller

demo += [6, 3, 5]

Etter hver operasjon skriver vi lista ut:

print(demo)

Tilbake til oppgaven

Lister i Python Tutor

Oppgave 1:

Vi skal forsøke å forutse hva som vil skje i Python Tutor når vi kjører koden under, linje for linje.

kvadrattall = []
for n in range(1, 5):
    kvadrattall.append(n**2)

Ved første klikk på «Next >» opprettes kvadrattall som en variabel med ei pil til ei tom liste. Ved andre klikk opprettes n som en variabel med verdi 1. Ved tredje klikk legges n2, det vil si 12 = 1 inn som første element i lista. Ved påfølgende klikk økes verdien til n med 1, og n2 legges til bakerst i lista. Dette fortsetter inntil n har fått verdien 4, og 42 = 16 er lagt til. (Vi husker at sluttverdien i range() ikke tas med, så 4 er siste verdi for n.) Resultatet ser slik ut:

Python Tutor etter ferdig kjøring av koden i oppgaven

Tilbake til oppgaven

Gjennomløpe lister

<>Oppgave 1:

Vi skal skrive Python-kode som oppretter ei liste som inneholder alle oddetall fra og med 1 til og med 19, og skriver dem ut, ett for ett.

For å generere oddetallene skriver vi range(1, 21, 2), som vil generere tall i skritt på 2 fra og med 1 inntil 21. (Det vil gjøre samme nytte å bruke 20 som sluttverdi, men vi holder oss til oddetall for logikkens skyld.) range() bruker vi så som argument til list(). Deretter bruker vi ei for-løkke til å hente ut og skrive ut tallene i lista. Koden kan se ut som vist under. Vi har kalt lista oddeliste, men den kan hete hva som helst.

# Oppretter ei liste med oddetallene fra 1 til 19,
# og skriver dem ut
oddeliste = list(range(1, 21, 2))
for oddetall in oddeliste:
    print(oddetall)

Tilbake til oppgaven

Oppgave 2:

Vi skal endre koden fra oppgave 1 slik at også nummeret på oddetallet skrives ut, sammen med litt forklarende tekst. Vi tar da i bruk enumerate() med startverdi 1, og bruker en f-streng i utskriften. Koden kan se slik ut:

# Oppretter ei liste med oddetallene fra 1 til 19,
# og skriver dem ut nummerert
oddeliste = list(range(1, 21, 2))
for nummer, oddetall in enumerate(oddeliste, start = 1):
    print(f"Oddetall nummer {nummer} er {oddetall}")

Tilbake til oppgaven

Oppgave 3:

Vi skal endre koden fra oppgave 1 slik at den bruker indekser til å skrive ut lista med oddetallene i omvendt rekkefølge.

Vi bruker da range() til å generere indekser som går fra siste indeks ned til første. Koden kan se ut som vist under.

# Oppretter ei liste med oddetallene fra 1 til 19,
# og skriver dem ut i baklengs rekkefølge
oddeliste = list(range(1, 21, 2))
for n in range(len(oddeliste) - 1, -1, -1):
    print(oddeliste[n])

Startverdien til range() blir len(oddeliste) − 1. Vi må trekke fra 1 fordi siste indeks i ei liste med n elementer er n − 1. Sluttverdien blir −1 fordi siste verdi i range() ikke tas med, og vi må ha med tallet 0. Skrittverdien blir −1 fordi vi går nedover i skritt på 1.

Alternativt setter vi startverdien til len(oddeliste) og sluttverdien til 0, og trekker fra 1 når vi bruker indeksen, slik det er vist under.

# Oppretter ei liste med oddetallene fra 1 til 19,
# og skriver dem ut i baklengs rekkefølge
oddeliste = list(range(1, 21, 2))
for n in range(len(oddeliste), 0, -1):
    print(oddeliste[n - 1])

Tilbake til oppgaven

«break»

Oppgave 1:

En student har skrevet koden under, som er ment å la brukeren skrive inn en streng, og så skrive ut en melding om strengen inneholder minst én vokal::

# Leser inn streng og sjekker om den inneholder vokal
streng = input("Streng å søke i: ")
for vokal in "aeiouyæøå":
    if vokal in streng:
        print("Strengen inneholder vokal.")
    else:
        print("Strengen inneholder ingen vokaler.")

Men koden virker ikke som tenkt, og vi skal forklare hva problemet er og skrive koden riktig.

Problemet er at koden for hver enkelt vokal i strengen "aeiouyæøå" skriver ut om akkurat den vokalen finnes i strengen eller ikke. Her må vi i stedet bruke break og else:

# Leser inn streng og sjekker om den inneholder vokal
streng = input("Streng å søke i: ")
for vokal in "aeiouyæøå":
    if vokal in streng:
        print("Strengen inneholder vokal.")
        break
else:
    print("Strengen inneholder ingen vokaler.")

Hvis vi i denne koden finner en vokal i strengen, får vi skrevet ut teksten Strengen inneholder vokal., og gjennomløpet av løkka avbrytes med break. else-blokka blir da ikke utført. Hvis løkka ikke blir avbrutt, men kjøres til siste vokal er sjekket, blir else-blokka utført, og teksten Strengen inneholder ingen vokaler. skrives ut.

Tilbake til oppgaven

Søke i lister

Oppgave 1:

Vi skal skrive kode som oppretter lista ensifrede, som inneholder heltallene fra og med 1 til og med 9, og skriver ut hvor mange av tallene i lista som er delelige med 4.

For å opprette lista bruker vi hintet, og skriver list(range(1, 10)).

Så bruker vi ei for-løkke til å gjennomløpe lista og telle hvor mange tall i lista som er delelige med 4. Koden kan se slik ut:

# Oppretter ei liste med tallene fra 1 til 9,
# og teller antall tall delelig med 4 i lista
ensifrede = list(range(1, 10))
antall = 0
for tall in ensifrede:
    if tall % 4 == 0: # Tallet er delelig med 4
    antall += 1
print(f"Lista inneholder {antall} tall som er delelige med 4.")

Tilbake til oppgaven

Opprette lister med inline-«for»

Oppgave 1:

Vi har koden under, som oppretter ei liste, y, med kvadratet av heltallene fra 1 til 10. 

# Oppretter lista y med tallene 1, 4, 9, ..., 100
y = []
for n in list(range(1, 11))
    y.append(n**2)

Så skal vi skrive om koden slik at den bruker inline-for til å opprette y. Koden kan se slik ut:

# Oppretter lista y med tallene 1, 4, 9, ..., 100
y = [n**2 for n in list(range(1, 11))]

Tilbake til oppgaven

Oppgave 2:

Vi har koden under, som oppretter ei liste, x, med heltallene fra 1 til 10, og ei liste, z, med 5n2 + 3n − 4 for hver n i x.

# Oppretter lista x med tallene 1 ... 10,
# og lista z med 5*n**2 + 3 * n - 4 for hver n i x
x = list(range(1, 11))
z = []
for n in x:
    z.append(5 * n**2 + 3 * n - 4)

Så skal vi skrive om koden slik at den bruker inline-for til å opprette z. Koden kan se slik ut:

# Oppretter lista x med tallene 1 ... 10,
# og lista z med 5n**2 + 3n - 4 for hver n i x
x = list(range(1, 11))
z = [5 * n**2 + 3 * n - 4 for n in x]

Tilbake til oppgaven

Dictionaries

Oppgave 1:

Vi skal skrive kode som

    • Oppretter en dictionary som heter landsprefiks, og inneholder følgende nøkkel-verdi-par: "Afghanistan": 93, "Albania": 355, "Algerie": 213, "Andorra": 0, "Angola": 244.

Vi oppretter landsprefiks som en dictionary ved å angi par med nøkler og verdier mellom krøllparenteser:

landsprefiks = {
    "Afghanistan": 93,
    "Albania": 355,
    "Algerie": 213,
    "Andorra": 0,
    "Angola": 244
}
    • Endrer verdien tilknyttet nøkkelen "Andorra" til 376 og legger til paret "Anguilla": 1264.

Vi bruker metoden update() og skriver:

landsprefiks.update({"Andorra": 376, "Anguilla": 1264})

Alternativt kan vi skrive

landsprefiks["Andorra"] = 376
landsprefiks["Anguilla"] = 1264
    • Slår opp og skriver ut verdien knyttet til nøkkelen "Angola".

Vi bruker metoden get() med "Angola" som nøkkel, og skriver:

print(landsprefiks.get("Angola"))
    • Slår opp og skriver ut meldingen "Ukjent land" ved oppslag med nøkkelen "Argentina".

Vi bruker igjen get(), men tar med "Ukjent land" som en streng get() skal returnere hvis nøkkelen ikke finnes:

print(landsprefiks.get("Argentina", "Ukjent land"))

Tilbake til oppgaven

Bruke dictionaries

Oppgave 1:

Vi har koden under, som bruker funksjonen randint() fra modulen random til å simulere kast med to terninger, og registrere summen av antall øyne på de to terningene.

from random import randint

oyne = randint(1, 6) + randint(1, 6)

Så skal vi skrive Python-kode som gjør en million slike simuleringer og teller opp og skriver ut hvor ofte de forskjellige summene av øyne forekommer. Utskriften skal være sortert på sum øyne.

Vi bruker de samme mekanismene som i eksempelet med å telle forekomster av tegn i en streng. Vi må også ha ei løkke som gjennomløpes en million ganger.

Koden kan se slik ut:

from random import randint

antall = {}  # Tom dictionary
for _ in range(1000000):
    oyne = randint(1, 6) + randint(1, 6)
    # Øk antall forekomster med 1
    antall.update({oyne: antall.get(oyne, 0) + 1})
antall = sorted(antall.items())
print(antall)

Tilbake til oppgaven