Iteration och list comprehension

Iterera över samlingar och skapa komprimerade uttryck med list comprehension.

Ca 50 min · del av Programmering i Python

Begrepp i lektionen

  • list comprehension
  • nästlade loopar
  • enumerate()
  • zip()

Efter denna lektion kommer du att kunna iterera smidigt över samlingar i Python med hjälp av enumerate() och zip(), samt skapa kompakta och effektiva listor med list comprehension.

Smidigare iteration: enumerate() och zip()

I Python itererar vi oftast direkt över elementen i en samling med en vanlig `for`-loop, till exempel `for frukt in frukter:`. Ibland behöver vi dock både elementets index och dess värde, eller så vill vi gå igenom två eller fler listor samtidigt.

Håll koll på index med enumerate()

Istället för att skapa en manuell räknare eller använda `range(len(lista))` erbjuder Python den inbyggda funktionen `enumerate()`. Den returnerar både index och element i varje iteration som en tupel:

python

frukter = ["äpple", "banan", "citron"]

for i, frukt in enumerate(frukter):

print(f"Index {i}: {frukt}")

Du kan även ange ett startindex, exempelvis `enumerate(frukter, start=1)` om du vill börja räkna från 1.

Parallell iteration med zip()

När du har två relaterade listor som du vill bearbeta sida vid sida använder du `zip()`. Funktionen 'blixtlåsar' ihop element från flera sekvenser:

python

namn = ["Anna", "Björn", "Celia"]

alder = [25, 30, 22]

for n, a in zip(namn, alder):

print(f"{n} är {a} år gammal")

Om listorna har olika längd stannar `zip()` automatiskt när den kortaste listan tar slut.

Grunderna i List Comprehension

List comprehension (listbyggare på svenska) är ett synnerligen populärt och koncist sätt att skapa nya listor utifrån befintliga sekvenser. Det ersätter det vanliga mönstret där man skapar en tom lista, kör en `for`-loop och lägger till element med `.append()`.

Syntax

Grundstrukturen för en list comprehension skrivs inom hakparenteser `[...]` och innehåller tre huvudsakliga delar:

1. Uttryck: Vad som ska hamna i den nya listan.

2. Element: Variabelnamnet för det aktuella elementet.

3. Sekvens: Samlingen som itereras över.

Exempel: Jämförelse

Säg att vi vill skapa en lista med alla kvadratserier från 0 till 4.

Med en vanlig for-loop:

python

kvadrater = []

for x in range(5):

kvadrater.append(x**2)

Resultat: [0, 1, 4, 9, 16]

Med list comprehension:

python

kvadrater = [x**2 for x in range(5)]

Resultat: [0, 1, 4, 9, 16]

Koden blir avsevärt kortare och ofta mycket lättare att läsa när du lärt dig mönstret.

Villkor och filtrering i List Comprehension

List comprehension blir ännu kraftfullare när vi lägger till villkorssatser (`if`-satser). Vi kan använda villkor på två olika sätt: för filtrering eller för transformation.

1. Filtrera element (if i slutet)

Om du vill sortera bort vissa element placerar du `if` sist i uttrycket. Endast element där villkoret utvärderas till `True` tas med i den nya listan.

python

tal = [1, 2, 3, 4, 5, 6, 7, 8]

jamna = [x for x in tal if x % 2 == 0]

Resultat: [2, 4, 6, 8]

2. Transformera med villkor (if-else i början)

Om du vill behålla alla element men ändra deras värde baserat på ett villkor (ternär operatör) placerar du `if-else` före `for`-slingan.

python

tal = [1, 2, 3, 4, 5]

status = ["jämnt" if x % 2 == 0 else "udda" for x in tal]

Resultat: ['udda', 'jämnt', 'udda', 'jämnt', 'udda']

Observera placeringen: `if` för filtrering hamnar sist, medan `if-else` för värdeval hamnar före `for`.

Nästlade loopar i List Comprehension

Ibland behöver vi arbeta med flerdimensionella datastrukturer, som matriser eller listor av listor. Precis som vanliga `for`-loopar kan nästlas, kan även list comprehensions göra det.

Att platta till en matris (Flattening)

Anta att vi har en tvådimensionell lista och vill göra om den till en enkel lista:

python

matris = [[1, 2, 3], [4, 5, 6]]

platt = [x for rad in matris for x in rad]

Resultat: [1, 2, 3, 4, 5, 6]

Ordningen på `for`-satserna i en list comprehension följer samma ordning som om du skrivit dem nästlade i vanliga loopar: yttre loop först, inre loop sedan.

Skapa koordinater

Vi kan också generera kombinatoriska strukturer, t.ex. alla par (x, y) i ett koordinatnät:

python

koordinater = [(x, y) for x in range(3) for y in range(2)]

Resultat: [(0,0), (0,1), (1,0), (1,1), (2,0), (2,1)]

Hela kursen