Filtern mit Python
Prädikate
Eine Funktion, die einen Wahrheitswert ergibt, wird auch als Prädikat bezeichnet.
Hierbei wird angenommen, daß die Funktion deterministisch ist, das heißt, daß ihr Ergebnis nur durch die Werte oder Objekte der Argumentausdrücke bestimmt wird.
Funktionen, die Werte anderer Typen als ›bool‹ ergeben, können als Prädikate angesehen werden, wenn die Wandlung des Ergebnisses in den Typ ›bool‹ eine Aussage über die Argumentewerte oder Argumentobjekte der Funktion macht.
filter
Die Klasse »filter« ergibt zu einem gegebenen Iterablen ein neues Iterable, das nur noch diejenigen Objekte aus dem gegebenen Iterablen enthält, welche eine bestimmte Bedingung erfüllen. (Eine Bedingung gilt als erfüllt, wenn sie nicht 0 oder False ist.)
- Konsolenprotokoll
from math import pi
dir()
['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'pi']
tuple( filter( lambda s: '_' not in s, dir() ))
('pi',)
So können wir nun endlich die uninteressanten Dunder-Namen ausfiltern!
Um Tupel mit einem einzigen Eintrag von eingeklammerten Werten zu unterscheiden, findet sich bei solchen Tupeln ein Komma vor der schließenden Klammer wie oben in »('pi',)«.
- Konsolenprotokoll
import math
dir( math )
['__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'comb', 'copysign', 'cos', 'cosh', 'degrees', 'dist', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'isqrt', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'perm', 'pi', 'pow', 'prod', 'radians', 'remainder', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc']
tuple( filter( lambda s: '_' in s, dir( math )))
('__doc__', '__loader__', '__name__', '__package__', '__spec__')
tuple( filter( lambda s: '_' not in s, dir( math )))
('acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'comb', 'copysign', 'cos', 'cosh', 'degrees', 'dist', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'isqrt', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'perm', 'pi', 'pow', 'prod', 'radians', 'remainder', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc')
Wir sind nun in der Lage, etwa gezielt alle Namen in einem Modul zu finden, die mit »s« beginnen.
- Konsolenprotokoll
import math
tuple( filter( lambda s: 's' <= s < 'w', dir( math )))
('sin', 'sinh', 'sqrt')
»'s' <= s < 'w'« bedeutet: „Die str-Zeichenfolge «s» liegt bei lexikographischer Sortierung zwischen »s« (einschließlich) und »w« (ausschließlich).“
Beispiel Anagramme finden
- Das Prädikat
from collections import Counter
is_anag = lambda pair: Counter( pair[ 0 ])== Counter( pair[ 1 ]) and pair[ 0 ]< pair[ 1 ]
is_anag( ( 'kiwi', 'wiki' ))
True
is_anag( ( 'kiwi', 'ding' ))
False
- Die Anwendung des Prädikats
from itertools import product
input = 'ampel salat tasche sache atlas lampe achat'.split()
pairs = product( input, input )
tuple( filter( is_anag, pairs ))
(('ampel', 'lampe'), ('atlas', 'salat'))
Übungsaufgaben
Bei all diesen Übungsaufgaben dürfen beliebig viele benannte Hilfsobjekte angelegt werden.
/ Übungsaufgabe
Schreiben Sie einen Ausdruck für ein Tupel aller Namen aus dem Modul »math«, die ein »o« enthalten.
/ Rechtschreibprüfung
Schreiben Sie zunächst ein Prädikat, das erkennt, ob ein Wort in der Liste der richtig geschriebenen Wörter enthalten ist.
- Das Prädikat soll also eine Funktion sein, die dann ›True‹ ergibt, wenn sie mit einer Zeichenfolge aufgerufen wird, die in der Liste enthalten ist, und sonst ›False‹.
- Konsolenprotokoll
woerter =( 'Brillanten', 'des', 'Die', 'Reflexion' )
Verwenden Sie dann jenes Prädikat um automatisch alle Wörter aus dem Text auszugeben, die nicht in der Liste enthalten sind.
- Konsolenprotokoll
text ="Die Reflektion des Brillianten"
/ Palidrome
Schreiben Sie zunächst ein Prädikat, das Palindrome erkennt.
- Das Prädikat soll also eine Funktion sein, die dann ›True‹ ergibt, wenn sie mit einer Zeichenfolge aufgerufen wird, die ein Palindrom ist, und ›False‹, wenn sie mit einer Zeichenfolge aufgerufen wird, die kein Palindrom ist.
Verwenden Sie dann jenes Prädikat um alle Palindrome aus dem Tupel ›input‹ auszugeben.
- Konsolenprotokoll
input =( 'schweiz', 'name', 'radar', 'sache', 'stadt', 'tisch' )
Hinweis Um die Reihenfolge der Zeichen einer Zeichenfolge zu vertauschen, kann eine Indizierung mit einer Auswahl aller Zeichen und einer negativen Schrittweite verwendet werden.
/ Übungsaufgabe
Schreiben Sie einen Ausdruck für ein Tupel aller Namen aus dem aktuellen Verzeichnis »dir()«, die maximal acht Zeichen umfassen.
/ Übungsaufgabe
Schreiben Sie einen Ausdruck für ein Tupel aller Zeilen aus der Eingabe (»stdin«), die keine Leerzeilen sind.
- Dialog
alpha
beta
gamma
delta
^Z
('alpha\n', 'beta\n', 'gamma\n', 'delta\n')