Oppprette lister med inline-«for»

Av og til kan det være at vi skal opprette lister som inneholder følger med tall som ikke er hele. Da kan vi ikke bruke range() direkte, fordi range() bare gir ut heltall. Det vi kan gjøre, derimot, er å bruke range() til å generer heltall, og så beregne tallene vi ønsker, ut fra disse. La oss for eksempel si at vi skal opprette ei liste, x, som inneholder tallene 0,1, 0,2, 0,3 og 0,4. Da kan vi la range() generere heltallene fra 1 til 4, og så dividere disse med 10 før vi legger dem inn i x, slik det er vist i eksempel 1.

Eksempel 1:

# Oppretter lista x med tallene 0,1, 0,2, 0,3 og 0,4
x = []
for n in range(1, 5):
    x.append(n/10)

I eksempel 1 oppretter vi først x som ei tom liste, og går så inn i ei løkke der variabelen n gjennomløper heltallene fra 1 til 4, mens vi legger n/10 til på slutten av lista.

Ved hjelp av noe som heter inline-for, kan vi imidlertid erstatte løkka med kode på én enkelt linje, slik det er vist i eksempel 2.

Eksempel 2:

# Oppretter lista x med tallene 0,1, 0,2, 0,3, 0,4
x = [n/10 for n in range(1, 5)]

I eksempel 2 ser vi at vi mellom klammeparentesene bruker samme uttrykk som i første linje i for-løkka i eksempel 1, for n in range(1, 5). I stedet for å bruke en innrykket blokk til å angi hva vi skal gjøre med løkkevariabelen n, skriver vi imidlertid bare et uttrykk som bruker n, foran kodeordet for, slik som n/10 i eksempel 2.

Denne mekanismen heter list comprehension på engelsk, og kalles derfor også listekomprehensjon på norsk.

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, ...
y = []
for n in list(range(1, 11))
    y.append(n**2)

Skriv om koden slik at den bruker inline-for til å opprette y.

Se løsningsforslag

Inline-for er et eksempel på inline-kode, som det finnes mange varianter av

Inline-for kan også brukes hvis vi skal opprette ei liste med innhold beregnet ut fra innholdet i en annen liste, slik det er vist i eksempel 3. Der oppretter vi først lista x som i eksempel 2, men oppretter også lista y med tallene fra x opphøyd i tredje.

Eksempel 3:

# Oppretter lista x med tallene 0,1, 0,2, 0,3, 0,4,
# og lista y med n**3 for hver n i x
x = [n/10 for n in range(1, 5)]
y = [n**3 for n in x]

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 5n**2 + 3n - 4 for hver n i x
x = list(range(1, 11))
z = []
for n in x:
    z.append(5 * n**2 + 3 * n - 4)

Skriv om koden slik at den bruker inline-for til å opprette z.

Se løsningsforslag

Kilder

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