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.
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.
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:
defis_even(num):return num %2==0
numbers =[1,2,3,4,5,6]
result =filter(is_even, numbers)print(list(result))Mogelijk gemaakt door
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))Mogelijk gemaakt door
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))Mogelijk gemaakt door
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))Mogelijk gemaakt door
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==0and x >10, numbers)print(list(result))Mogelijk gemaakt door
(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)Mogelijk gemaakt door
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))Mogelijk gemaakt door
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 inrange(10))
result =filter(lambda x: x %2==0, numbers)print(list(result))Mogelijk gemaakt door
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))Mogelijk gemaakt door
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 onzePython Programming Fundamentals-skill track aan.
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.
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, laatfilter()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 enTrueofFalseretourneert. Als de test slaagt (lees: als je functieTrueteruggeeft) houdtfilter()het item. Anders slaat het item over. Dat spreekt behoorlijk voor zich, dus laten we verdergaan.Python filter() syntaxis
Zo ziet het eruit:
function: Geeft de test aan die je op elk item wilt toepassen. Moet één argument nemen enTrueofFalseretourneren.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 houdtfilter()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:
Dit print:
Merk op hoe
is_evencontroleert 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:
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 als0, lege strings,NoneofFalse, en we willen dit doen zonder een eigen functie te schrijven.Python heeft hier een trucje voor: als je het functeargument in
filter()opNonezet, verwijdertfilter()automatisch alle items die Python alsFalsebeschouwt.Hier is een voorbeeld:
Dit print:
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.Je krijgt:
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.
Dit print:
(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:
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:
Dit print:
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:
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()enmap()te combineren. Eerst selecteertfilter()de items die je wilt, en daarna pastmap()een andere functie op elk item toe.Zo ziet dat eruit in de praktijk:
Dit print:
Door
filter()enmap()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.