Ga naar hoofdinhoud

Python filter(): houd wat je nodig hebt

Leer hoe je de functie filter() van Python gebruikt om items uit lijsten of andere iterables te halen. Begrijp de belangrijkste verschillen tussen filter en vergelijkbare Python-tools.
· 7 min lezen

Verken met AI

Filteren is een van de meest voorkomende taken in Python, en daarom maakt Python het je makkelijk. Een van de eenvoudigste manieren om data te filteren is met de ingebouwde functie filter(). Zoals de naam al aangeeft, laat filter() je alleen de items eruit halen die aan een bepaalde voorwaarde (of voorwaarden) voldoen.

In deze gids lees je hoe het werkt, wanneer je het gebruikt en hoe het zich verhoudt tot andere filtertools. Lees vooral even verder!

Wat Python filter() doet

filter() laat je elementen uit een lijst, tuple of elk ander iterable halen, maar alleen als ze voor jouw test slagen. Je geeft een functie (soms ook wel een predicaat genoemd) die elk item neemt en True of False retourneert. Als de test slaagt (lees: als je functie True teruggeeft) houdt filter() het item. Anders slaat het item over. Dat spreekt behoorlijk voor zich, dus laten we verdergaan.

Python filter() syntaxis

Zo ziet het eruit:

filter(function, iterable)
  • function: Geeft de test aan die je op elk item wilt toepassen. Moet één argument nemen en True of False retourneren.

  • iterable: Levert een lijst, tuple, string of elk object waar je over kunt itereren.

Als je filter() aanroept, krijg je een speciaal filterobject terug, niet direct een lijst of tuple. Om daadwerkelijk met de gefilterde resultaten te werken, wikkel je de output meestal in een list of tuple. Deze ontwerpkeuze houdt filter() efficiënt, maar het is iets om in gedachten te houden terwijl je code schrijft.

Python filter() voorbeelden

Laten we even oefenen.

Python filter() met een eigen functie

Laten we filter() gebruiken met een functie die we zelf schrijven.

Stel, je wilt alleen de even getallen uit een lijst behouden:

def is_even(num):
    return num % 2 == 0

numbers = [1, 2, 3, 4, 5, 6]
result = filter(is_even, numbers)
print(list(result))

Dit print:

[2, 4, 6]

Merk op hoe is_even controleert of een getal deelbaar is door 2. filter() gebruikt onze eigen functie om elk item te testen en houdt de items die voor de test slagen.

Python filter() met lambda-functies

Natuurlijk heeft niet elke filter een volledige functiedefinitie nodig. Soms is je filterregel zo eenvoudig of zo plaatsgebonden dat een benoemde functie schrijven te veel werk is.

Hier is hetzelfde voorbeeld met even getallen, maar dan met een lambda voor een beknopte, inline test:

numbers = [1, 2, 3, 4, 5, 6] 
result = filter(lambda x: x % 2 == 0, numbers) 
print(list(result))

Je krijgt dezelfde output als eerder.

Een lambda met filter() gebruiken is vooral gebruikelijk als je je code kort en to-the-point wilt houden. Het is ideaal voor eenmalige filtertaken, zodat je je regel precies daar kunt uitdrukken waar je die nodig hebt.

Python filter() met None als functie

Soms wil je lege of valse waarden met filter() weghalen. Dingen als 0, lege strings, None of False, en we willen dit doen zonder een eigen functie te schrijven.

Python heeft hier een trucje voor: als je het functeargument in filter() op None zet, verwijdert filter() automatisch alle items die Python als False beschouwt.

Hier is een voorbeeld:

items = [0, 1, '', 'hello', [], [2, 3], None, False, True] 
result = filter(None, items) 
print(list(result))

Dit print:

[1, 'hello', [2, 3], True]

Tekstdata filteren

Laten we filter() nu toepassen op een praktisch, alledaags probleem. Stel dat je een lijst met woorden hebt en alleen die wilt die beginnen met 'a'. Dit soort gericht filteren komt voortdurend voor bij het verwerken van tekst.

words = ['apple', 'banana', 'apricot', 'cherry', 'avocado'] 
result = filter(lambda word: word.startswith('a'), words) 
print(list(result))

Je krijgt:

['apple', 'apricot', 'avocado']

Filteren met meerdere voorwaarden

Soms worden je filtercriteria complexer. Wat als je items nodig hebt die aan meerdere voorwaarden voldoen? Zo doe je dat met een lambda. In dit voorbeeld zoeken we getallen die zowel even zijn als groter dan 10.

numbers = [4, 10, 12, 15, 20, 23, 28] 
result = filter(lambda x: x % 2 == 0 and x > 10, numbers) 
print(list(result))

Dit print:

[12, 20, 28]

(Als ik nog meer voorwaarden zou hebben, zou ik voor de duidelijkheid overstappen van een lambda naar een benoemde functie.)

filter() vs. list comprehension

List comprehensions zijn een andere populaire manier om items te selecteren. Beide benaderingen laten je data filteren, maar elk heeft z’n eigen stijl.

Hier is het voorbeeld met even getallen opnieuw, ditmaal met een list comprehension:

numbers = [1, 2, 3, 4, 5, 6] 
result = [x for x in numbers if x % 2 == 0] 
print(result)
[2, 4, 6]

Zowel filter() als list comprehensions klaren de klus. List comprehensions zijn vaak makkelijker te lezen voor eenvoudige filters, vooral wanneer de regel kort en simpel is.

Aan de andere kant werkt filter() goed wanneer je toch al met functies werkt, of wanneer je meerdere verwerkingsstappen wilt aaneenrijgen.

Meer geavanceerde toepassingen

Laten we wat interessantere gevallen zoeken:

filter() met andere iterables

Net zoals bij lijsten werkt filter() ook met elk iterable, zoals tuples, sets — zelfs generator-expressies. Handig om te weten, want je data staat niet altijd in lijstvorm.

Zo kun je een tuple filteren:

numbers = (10, 15, 20, 25, 30) 
result = filter(lambda x: x > 20, numbers) 
print(tuple(result))

Dit print:

(25, 30)

Vergeet niet het filterobject om te zetten naar het type dat je wilt (list, tuple, enz.) wanneer je de resultaten direct nodig hebt.

Ik noemde ook generators, dus voor de volledigheid laat ik ook een voorbeeld zien van filteren met generators:

numbers = (x for x in range(10))
result = filter(lambda x: x % 2 == 0, numbers)
print(list(result))

Dit is een generator omdat deze regel: numbers = (x for x in range(10)) een generatorobject maakt. (Hij is lui en genereert niet alle waarden in één keer.)

De laatste regel: print(list(result)) dwingt evaluatie af door het luie filterobject om te zetten naar een lijst.

filter() combineren met map()

Wat als je zowel wilt filteren als transformeren, zoals in ons volgende voorbeeld: alleen de even getallen in een lijst kwadrateren?

Python maakt dit eenvoudig door filter() en map() te combineren. Eerst selecteert filter() de items die je wilt, en daarna past map() een andere functie op elk item toe.

Zo ziet dat eruit in de praktijk:

numbers = [1, 2, 3, 4, 5, 6] 
evens = filter(lambda x: x % 2 == 0, numbers) 
squared = map(lambda x: x ** 2, evens) 
print(list(squared))

Dit print:

[4, 16, 36]

Door filter() en map() te ketenen, bouw je heldere, leesbare datapijplijnen: eerst selecteer je de items die ertoe doen, daarna transformeer je ze waar nodig. Er zullen genoeg momenten zijn waarop je dit patroon zelf kunt gebruiken.

Dingen om op te letten

Hoe handig filter() ook is, er zijn een paar veelgemaakte fouten:

  • filter() retourneert een filterobject, geen lijst. Dat kan verwarrend zijn als je meteen resultaten verwacht. Wikkel het altijd in een list (of tuple) als je de uitkomst wilt zien of hergebruiken.

  • filter() werkt maar met één iterable tegelijk. Als je wilt filteren op basis van meerdere lijsten, moet je ze eerst zippen of een andere aanpak gebruiken.

  • filter() is lui. Het verwerkt de data pas echt wanneer je het omzet naar een lijst, tuple, of eroverheen loopt. Houd dit gedrag in gedachten bij het debuggen.

Conclusie

Zoals je hebt gezien, biedt de functie filter() van Python een snelle manier om data op te schonen door alleen te nemen wat ertoe doet. filter() is handig of je nu een eenmalige lambda schrijft of een benoemde functie inplugt. 

Als je nog niet zeker weet hoe je filter() gebruikt, of als je dit eenvoudig genoeg vond en wilt doorleren, hebben we mooie resources om je te helpen. Ik raad onze Python Programming Fundamentals-skill track aan. 

Josef Waples

Auteur

Josef Waples

Ik ben een schrijver en editor op het gebied van data science en heb bijgedragen aan onderzoeksartikelen in wetenschappelijke tijdschriften. Ik ben vooral geïnteresseerd in lineaire algebra, statistiek, R en dergelijke. Ik speel ook best wat schaak! 

Python Filter veelgestelde vragen

Wat doet de Python-functie filter()?

De functie filter() neemt een functie en een iterable en retourneert een nieuwe iterable met alleen de items die voor een test slagen. De testfunctie moet True retourneren voor items die je wilt behouden en False voor items die je wilt overslaan.

Waarom moet ik het resultaat van filter() in list() of tuple() wikkelen?

filter() retourneert een filterobject, wat een iterator is. Om de gefilterde resultaten te bekijken of te hergebruiken zet je het doorgaans om naar een lijst of tuple met list() of tuple(). Deze stap is essentieel om te printen, debuggen of het resultaat door te geven aan andere functies.

Kan ik filter() gebruiken zonder een eigen functie te schrijven?

Ja. Je kunt een lambda-functie gebruiken voor korte, eenmalige tests, of None doorgeven als functeargument om automatisch alle "falsy" waarden te verwijderen, zoals 0, '', None en False.

Hoe verhoudt filter() zich tot list comprehensions?

Zowel filter() als list comprehensions laten je data filteren, maar list comprehensions zijn vaak leesbaarder voor eenvoudige voorwaarden. filter() is handig wanneer je logica via functies hergebruikt of wanneer je wilt ketenen met tools zoals map().

Kan ik meerdere voorwaarden toepassen met filter()?

Absoluut. Je kunt meerdere voorwaarden combineren met logische operatoren binnen je testfunctie of lambda. Voor complexe logica is het vaak beter om een benoemde functie te gebruiken om de code leesbaar te houden.

Onderwerpen

Gerelateerd