Wat is list comprehension in Python?
List comprehension in Python is een mooie en goede manier om op basis van bestaande lijsten nieuwe lijsten te creëren. Als data scientist kun je met Python op diverse manieren lists maken. Zo kun je for loops of map()
gebruiken.
Echter, list comprehensions brengen een aantal voordelen:
- List comprehensions zijn veelzijdig. Zo kun je bijvoorbeeld makkelijk direct een bepaalde filtering toepassen bij het aanmaken van een lijst.
- List comprehensions maken een Python script goed leesbaar en daarmee gemakkelijk te begrijpen. Waar je bij het gebruik van bijvoorbeeld
map()
de volgorde van de in te geven argumenten moet onthouden, en bij for loops zelf een lege lijst moet aanmaken, zijn list comprehensions simpeler. Je kunt erop vertrouwen dat Python een lijst voor je aanmaakt en zelf focussen op de inhoud van jouw list.
Syntax van een list comprehension
In bovenstaande afbeelding tonen we de syntax van een list comprehension. Als je Python wilt leren zijn list comprehensions een onmisbaar onderdeel. De syntax is altijd:
[EXPRESSIE for ITEM in LIJST]
- Een list comprehension start met een bepaalde expressie. In ons voorbeeld is dit 'x', maar dit had bijvoorbeeld ook x.upper() kunnen zijn. De output had dan bestaan uit hoofdletters.
- Vervolgens volgt het item uit de lijst waarop de expressie (zie 1) wordt toegepast. In ons voorbeeld is dit 'x'.
- Tenslotte volgt de lijst zelf. In ons voorbeeld een string (in weze een lijst van letters).
In dit blog zullen we onderstaande onderwerpen verder uitdiepen:
- Strings & list comprehension
- For loops & list comprehension
- List comprehensions vs Lambda functions
- 'if' gebruiken in list comprehensions
Strings & list comprehension
Het is mogelijk om strings (tekst of andere tekens) te gebruiken binnen list comprehensions. Zo kun je een woord, een zin, of een reeks andere karakters omzetten naar een lijst. Desgewenst kun je tevens bewerkingen doen op de elementen uit de string.
Hierbij een voorbeeld van list comprehension waarbij we de string 'zo werkt het' via list comprehension omzetten in een lijst:
Hierbij een voorbeeld waarbij we dezelfde list comprehension toepassen met een andere expressie, namelijk x.upper() waardoor de items omgezet worden naar hoofdletters.
hoe_werkt_list_comprehension = [x.upper() for x in 'zo werkt het']
print(hoe_werkt_list_comprehension)
['Z', 'O', ' ', 'W', 'E', 'R', 'K', 'T', ' ', 'H', 'E', 'T']
For loops & list comprehension
In de meeste data science vraagstukken komt deze keuze het vaakst ter sprake; ga ik een for loop maken of list comprehension gebruiken? Zoals aangegeven brengen list comprehensions in veel gevallen voordelen over for loops. Echter, niet iedere for loop kan omgeschreven worden tot een list comprehension. Gebruik dus list comprehensions wanneer het kan, en for loops wanneer het moet.
Wanneer je met een for loop werkt definieer je eerst zelf een lege lijst. Binnen de for loop gebruik je lijst.append() om de lege lijst te vullen terwijl je over de lijst heen itereert.
lijst = []
for x in [0, 4, 8, 10.2, 14.6]:
lijst.append(round(x))
print(lijst)
[0, 4, 8, 10, 15]
Hetzelfde kun je in één regel bereiken wanneer je Python list comprehension gebruikt. Naast dat dit minder werk is, leest de code ook nog eens gemakkelijker weg omdat diverse zaken die er niet toe doen weggelaten kunnen worden (e.g. het initiëren van een lege lijst & het appenden van de items binnen de for loop).
lijst = [round(x) for x in [0, 4, 8, 10.2, 14.6]]
print(lijst)
[0, 4, 8, 10, 15]
'If' gebruiken in list comprehension
Het is mogelijk om meer logica op te nemen binnen jouw list comprehension door de standaard syntax uit te breiden naar:
[EXPRESSIE for ITEM in LIJST if VOORWAARDE]
Dit geeft legio nieuwe mogelijkheden. Een simpel voorbeeld is om alleen waarden uit een list te filteren die deelbaar zijn door twee.
lijst = [x for x in [0, 4, 8, 10.2, 14.6] if x%2 == 0]
print(lijst)
[0, 4, 8]
Het is mogelijk om meerdere if's na elkaar te gebruiken. Wanneer een item aan alle voorwaarden voldoet wordt deze opgenomen in de nieuwe lijst.
lijst = [x for x in [0, 4, 8, 10.2, 14.6] if x%2 == 0 if x%8 == 0]
print(lijst)
[0, 8]
Het is ook mogelijk om functies te gebruiken na de 'if' statement binnen de list comprehension.
def geen_z(letters):
verboden_letter = 'z'
return letters not in verboden_letter
hoe_werkt_list_comprehension = [x for x in 'zo werkt het' if geen_z(x)]
print(hoe_werkt_list_comprehension)
['o', ' ', 'w', 'e', 'r', 'k', 't', ' ', 'h', 'e', 't']
Je ziet in bovenstaand voorbeeld dat we een functie maken die een verboden letter kan detecteren. Met deze functie zorgen we ervoor dat onze verboden letter ('z') niet wordt opgenomen in de output.
List comprehensions vs Lambda functions
Naast list comprehensions zijn er meer efficiënte manieren om nieuwe lijsten te maken of bestaande lijsten te bewerken. Met Lambda functions kun je in weinig regels code veel doen.
hoe_werkt_list_lambda = list(map(lambda x : x, 'zo werkt lambda'))
print(hoe_werkt_list_lambda)
['z', 'o', ' ', 'w', 'e', 'r', 'k', 't', ' ', 'l', 'a', 'm', 'b', 'd', 'a']
Over het algemeen wordt list comprehension als leesbaarder beschouwd en is daardoor voor de meeste mensen gemakkelijker te begrijpen.
Wil je nog veel meer leren over Python en de mogelijkheden voor data analyse? Schrijf je dan in voor onze Python cursus voor data science, onze machine learning training, of voor onze data science opleiding en leer met vertrouwen te programmeren en analyseren in Python. Nadat je een van onze trainingen hebt gevolgd kun je zelfstandig verder aan de slag. Je kunt ook altijd even contact opnemen als je een vraag hebt.
Download één van onze opleidingsbrochures voor meer informatie
Rik is data scientist en marketeer bij Data Science Partners. Vanuit zijn achtergrond op de Technische Universiteit Eindhoven heeft hij veel affiniteit met data. Na zijn studie heeft hij als consultant altijd met data gewerkt en tevens ervaring opgedaan in het geven van trainingen.