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
- Variabler, datatyper och I/O
- Operatorer och logiska uttryck
- Villkorssatser
- Slingor och iteration
- Listor och sekvenser
- Tupler och mängder
- Dictionaries
- Iteration och list comprehension
- Funktionsdefinitioner och parametrar
- Variablers räckvidd (Scope)
- Moduler och Pythons standardbibliotek
- Läsa och skriva filer
- Felhantering och undantag
- Text- och databearbetning