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 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

Filtrere med inline-if

Vi kan bruke inline-if til å filtrere elementer vi produserer med inline-for. Da legger vi til en if uten else bakerst.

Eksempel 4:

Vi har ei liste, x:

x = [1, 18, 25, 4, 17, 9]

Så skal opprette ei liste, y, og legge inn kvadratet av alle tall fra x som er større enn 10. Det kan vi gjøre med inline-for og inline-if, slik:

# Oppretter lista y med kvadratet av tallene > 10 i x
y = [n**2 for n in x if n > 10]

Skriver vi så print(y), får vi skrevet ut [324, 625, 289], som er kvadratet av tallene 18, 25 og 17.

Oppgave 3:

Vi har ei liste, x:

x = [1, 5, 6, 2, 8, 9]

Skriv kode med inline-for og inline-if som oppretter ei liste, y, som inneholder kvadratet av partallene i x. Bruk print() til å sjekke at du får skrevet ut [36, 4, 64]. (Et tall, n, er et partall hvis n % 2 == 0).

Se løsningsforslag

Kilder

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