Filtern mit Python (Filtern mit Python), lesson, Seite 724581
https://www.purl.org/stefan_ram/pub/filtern_python (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram
Python-Kurs

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')

 

Seiteninformationen und Impressum   |   Mitteilungsformular  |   "ram@zedat.fu-berlin.de" (ohne die Anführungszeichen) ist die Netzpostadresse von Stefan Ram.   |   Eine Verbindung zur Stefan-Ram-Startseite befindet sich oben auf dieser Seite hinter dem Text "Stefan Ram".)  |   Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram. Schlüsselwörter zu dieser Seite/relevant keywords describing this page: Stefan Ram Berlin slrprd slrprd stefanramberlin spellched stefanram724581 stefan_ram:724581 Filtern mit Python Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd724581, slrprddef724581, PbclevtugFgrsnaEnz Erklärung, Beschreibung, Info, Information, Hinweis,

Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram.
https://www.purl.org/stefan_ram/pub/filtern_python