Slik bruker du list comprehension i Python

Lær list comprehension i Python. Lag lister på én linje med betingelser og transformasjoner.

Videoforhåndsvisning

Opprett konto for å se video

Det er helt gratis og tar under 30 sekunder

Opprett gratis kontoHar du konto? Logg inn

Du skal lage en liste med alle partall mellom 0 og 100. Med en vanlig for-løkke trenger du tre linjer: opprett en tom liste, iterer gjennom tallene, og legg til med append(). Med list comprehension i Python gjør du det samme på én linje. Det er en kompakt syntaks for å opprette lister, og den er blant de mest brukte Python-funksjonene blant erfarne utviklere.

Grunnleggende list comprehension

Syntaksen følger alltid samme mønster: [uttrykk for element in iterabel]. Det du skriver foran for-delen bestemmer hva som havner i listen. Det du skriver etter in-delen bestemmer hva du itererer over.

Her er et enkelt eksempel. Du vil ta hver bokstav i et ord og legge den i en liste:

bokstaver = [bokstav for bokstav in "Python"]
Resultat: ["P", "y", "t", "h", "o", "n"]

Uttrykket kan være mer enn bare elementet. Du kan kalle metoder eller gjøre beregninger:

store = [bokstav.upper() for bokstav in "Python"]
Resultat: ["P", "Y", "T", "H", "O", "N"]

Sammenlignet med den tradisjonelle metoden sparer du to linjer og holder intensjonen tydelig. Du slipper å opprette en tom liste og kalle append() manuelt. Med en vanlig for-løkke trenger du først bokstaver = [], deretter løkken, og til slutt append() inne i løkken. Med comprehension er alt samlet i én setning.

List comprehension med betingelse

Den virkelige styrken kommer når du legger til en if-betingelse. Da filtrerer du elementene mens du bygger listen:

partall = [n for n in range(20) if n % 2 == 0]
Resultat: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

Betingelsen står helt til slutt. Bare elementer som oppfyller vilkåret havner i listen. Du kan legge til flere betingelser:

delelig = [n for n in range(100) if n % 2 == 0 if n % 5 == 0]
Resultat: [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]

Begge betingelsene må være oppfylt. Det fungerer som en and-operasjon. For tall fra 0 til 100 som er delelige på både 2 og 5 får du hvert tiende tall. Du kan også skrive det som én betingelse med and: if n % 2 == 0 and n % 5 == 0. Resultatet er identisk.

If-else i uttrykket

Du kan også bruke if-else, men da står den i uttrykks-delen (foran for), ikke etter:

typer = ["partall" if n % 2 == 0 else "oddetall" for n in range(10)]
Resultat: ["partall", "oddetall", "partall", "oddetall", ...]

Legg merke til forskjellen: if etter for filtrerer hvilke elementer som tas med. If-else foran for bestemmer hva slags verdi hvert element får. Dette skillet forvirrer mange, men det er konsekvent: filtreringen er bak, transformasjonen er foran. Husk denne regelen: filter-if har ingen else, transform-if krever else.

Når du bør bruke list comprehension

List comprehension i Python er best for enkle transformasjoner og filtreringer. Typiske bruksområder:

  • Konvertere verdier: [int(x) for x in streng_liste]
  • Filtrere data: [bruker for bruker in brukere if bruker.aktiv]
  • Trekke ut felt: [produkt.pris for produkt in produkter]

Men det finnes en grense. Når uttrykket blir så langt at du må scrolle sidelengs for å lese det, er en vanlig for-løkke bedre. En god regel: hvis du trenger mer enn én linje for å forstå hva comprehensionen gjør, skriv den om til en løkke.

Nestet list comprehension

Du kan neste comprehensions, men dette bør du bruke med forsiktighet:

matrise = [[j for j in range(3)] for i in range(3)]
Resultat: [[0, 1, 2], [0, 1, 2], [0, 1, 2]]

Den ytre comprehensionen lager rader, den indre lager kolonnene i hver rad. Leseretningen kan forvirre: den ytre løkken står til høyre, den indre til venstre. For todimensjonale strukturer som matriser kan dette være nyttig, men for noe mer komplekst bør du bruke vanlige for-løkker. Nestede comprehensions er notorisk vanskelige å lese, og lesbarhet slår alltid korthet.

Ytelse sammenlignet med for-løkker

List comprehension er ikke bare kortere. Den er også raskere enn en tilsvarende for-løkke med append(). Python kan optimalisere comprehensionen internt fordi den vet på forhånd at resultatet er en liste. For små lister merker du ingen forskjell, men ved tusenvis av elementer kan det utgjøre målbare tidsbesparelser.

Det betyr ikke at du alltid skal velge comprehension for ytelsens skyld. Forskjellen er marginal for de fleste oppgaver. Velg den varianten som gir tydeligst kode. En oversiktlig for-løkke er bedre enn en uleselig comprehension, uansett ytelse. I profesjonelle Python-prosjekter er normen enkel: bruk comprehension for enkle operasjoner, for-løkker for alt som krever mer enn én linje logikk.

Neste steg

List comprehension bygger på lister og listemetoder, så sørg for at du er komfortabel med disse først. Vil du jobbe med nøkkel-verdi-par i stedet for indekser, er dictionaries et naturlig neste steg (dict comprehension fungerer nesten likt). Pythons offisielle dokumentasjon har flere eksempler på list comprehension med nestede strukturer.

Denne videoen er hentet fra kurset Python for nybegynnere på Utdannet.no. I det fulle kurset bruker du list comprehension i Python til å filtrere datasett, transformere lister og skrive kortfattet kode som gjør mye med lite.