In this article we explain and use predicates in Python.
in general meaning is a statement about something that is either true or false. In programming, predicates represent single argument functions that return a boolean value.
The following is a simple example using a predicate function.
#!/usr/bin/python def ispos(n): return n > 0 vals = [-3, 2, 7, 9, -1, 0, 2, 3, 1, -4, 6] fres = filter(ispos, vals) print(list(fres))
We have a list of values. Using the filter function, we filter out positive numbers.
def ispos(n): return n > 0
The ispos is a simple predicate, which returns true for all values that are greater than zero.
fres = filter(ispos, vals)
The filter function takes the predicate as its first argument. It returns an iterable of values that satisfy the condition.
print(list(fres))
We turn the iterable into a list with the list built-in function.
$ ./simple.py [2, 7, 9, 2, 3, 1, 6]
Anonymous predicates can be created with lambda .
#!/usr/bin/python vals = [-3, 2, 7, 9, -1, 0, 2, 3, 1, -4, 6] fres = filter(lambda e: e < 0, vals) print(list(fres))
In the example, we filter out all elements that are negative using a lambda function.
$ ./anon.py [-3, -1, -4]
A predicate can be used in a Python list comprehension.
list_com.py#!/usr/bin/python def is_vowel(c): vowels = 'aeiou' if c in vowels: return True else: return False sentence = 'There are eagles in the sky.' vowels = [c for c in sentence if is_vowel(c)] print(vowels)
The example filters out all vowels from a sentence.
def is_vowel(c): vowels = 'aeiou' if c in vowels: return True else: return False
The function is a predicate. It returns True for a vowel character.
vowels = [c for c in sentence if is_vowel(c)]
The logic of the if condition is delegated to the is_vowel predicate.
$ ./list_com.py ['e', 'e', 'a', 'e', 'e', 'a', 'e', 'i', 'e']
The external more_itertools module contains plenty of functions for working on iterables. Many of them accept predicates as arguments.
#!/usr/bin/python from more_itertools import locate def pfn(n): return n > 0 and n % 2 == 0 vals = [-3, 2, 7, 9, -1, 0, 2, 3, 1, -4, 6] idx = list(locate(vals, pfn)) vals2 = [vals[e] for e in idx] print(vals2)
The example uses the locate function to find all values that satisfy the given condition; in our case, that are greater that zero and divisible by two.
idx = list(locate(vals, pfn))
We pass the values and the predicate function as parameters to the locate .
vals2 = [vals[e] for e in idx]
Since the function returns indexes, we turn them into values using a list comprehension.
$ ./locate.py [2, 2, 6]
In this article we have used predicates in Python.
My name is Jan Bodnar and I am a passionate programmer with many years of programming experience. I have been writing programming articles since 2007. So far, I have written over 1400 articles and 8 e-books. I have over eight years of experience in teaching programming.