Übergeben einer Funktion mit zwei Argumenten an filter () in Python

8

Gegeben die folgende Liste:

%Vor%

Ich möchte Strings länger als 3 Zeichen filtern. Ich erreiche das mit dem folgenden Code:

Mit for-Schleife:

%Vor%

Aber ich möchte, dass mein Code allgemeiner ist, damit ich später Strings beliebiger Länge filtern kann, also verwende ich eine Funktion und eine for-Schleife:

%Vor%

Ich möchte die gleiche Allgemeinheit mit filter() erreichen, aber das kann ich nicht erreichen. Wenn ich die obige Funktion get_long() verwende, kann ich einfach keine Argumente an sie übergeben, wenn ich sie mit filter() verwende. Ist es einfach nicht möglich oder gibt es einen Weg um es herum?

Mein Code mit filter() für den speziellen Fall:

%Vor%     
Homap 05.01.2016, 10:53
quelle

7 Antworten

15

Verwenden Sie lambda , um den Schwellenwert wie folgt anzugeben:

%Vor%     
Andrea Corbellini 05.01.2016, 10:57
quelle
15

Was Sie zu tun versuchen, ist bekannt als Teilfunktionsanwendung : Sie haben eine Funktion mit mehreren Argumenten (in dieser case, 2) und möchte eine davon abgeleitete Funktion mit einem oder mehreren fixen Argumenten erhalten, die Sie dann an filter übergeben können.

Einige Sprachen (besonders funktionale) haben diese Funktionalität "eingebaut". In Python können Sie dafür lambdas verwenden (wie andere gezeigt haben) oder Sie können die functools -Bibliothek . Insbesondere functools.partial :

  

Das partielle () wird für die Anwendung einer Teilfunktion verwendet, die einen Teil der Argumente und / oder Schlüsselwörter einer Funktion "einfriert", was zu einem neuen Objekt mit einer vereinfachten Signatur führt. Beispielsweise kann partial () verwendet werden, um ein Callable zu erstellen, das sich wie die Funktion int () verhält, wobei das Basisargument standardmäßig zwei ist:

%Vor%

So können Sie tun:

%Vor%     
LeartS 05.01.2016 11:03
quelle
10

Müssen Sie filter() verwenden? Warum nicht ein mehr pythonisches Listenverständnis verwenden?

Beispiel:

%Vor%

Diese Methode hat den Vorteil, dass es trivial ist, sie in einen Generator umzuwandeln, der abhängig von Ihrer Anwendung, z. Wenn Sie viele DNA-Sequenzen haben und diese durchlaufen wollen, wird die Realisierung als Liste sehr viel Speicher auf einmal verbrauchen. Der äquivalente Generator muss lediglich die eckigen Klammern [] durch runde Klammern ersetzen () :

%Vor%

In Python 2 ist diese Leistungsverbesserung keine Option mit filter() , weil sie eine Liste zurückgibt. In Python gibt 3 filter() ein Filterobjekt zurück, das einem Generator ähnlicher ist.

    
mhawke 05.01.2016 11:29
quelle
4

Sie können is_long eine Funktion zurückgeben, die dna akzeptiert, wie dies

%Vor%

und dann in filter verwenden, so

%Vor%

Hinweis: Verwenden Sie nicht den Operator is , um boolesche Werte oder Zahlen zu vergleichen. Stattdessen verlassen Sie sich so weit wie möglich auf die Wahrheit der Daten. In deinem Fall hättest du deine zweite Version so schreiben können.

%Vor%

Zitieren Programmierempfehlungen in PEP-8 ,

  

Vergleichen Sie boolesche Werte nicht mit True oder False mit ==.

%Vor%
    
thefourtheye 05.01.2016 10:59
quelle
0

Hier sind ein paar weitere Möglichkeiten mit lambda . Der erste verwendet ein Standard-Schlüsselwort-Argument, um die gewünschte Länge zu halten. Der zweite bettet einfach die gewünschte Länge in lambda body ein.

%Vor%

Ausgabe

%Vor%

Im ersten Beispiel könnten Sie auch tun:

%Vor%

Ebenso können Sie im zweiten Beispiel das Literal 5 durch eine lokale (oder globale) Variable ersetzen, zB:

%Vor%     
PM 2Ring 05.01.2016 11:34
quelle
0
___ qstnhdr ___ Übergeben einer Funktion mit zwei Argumenten an filter () in Python ___ answer34610018 ___

Verwenden Sie filter , um den Schwellenwert wie folgt anzugeben:

%Vor%     
___ answer34610060 ___

Sie können %code% eine Funktion zurückgeben, die %code% akzeptiert, wie dies

%Vor%

und dann in %code% verwenden, so

%Vor%

Hinweis: Verwenden Sie nicht den Operator %code% , um boolesche Werte oder Zahlen zu vergleichen. Stattdessen verlassen Sie sich so weit wie möglich auf die Wahrheit der Daten. In deinem Fall hättest du deine zweite Version so schreiben können.

%Vor%

Zitieren Programmierempfehlungen in PEP-8 ,

  

Vergleichen Sie boolesche Werte nicht mit True oder False mit ==.

%Vor%
    
___ answer34610760 ___

Hier sind ein paar weitere Möglichkeiten mit %code% . Der erste verwendet ein Standard-Schlüsselwort-Argument, um die gewünschte Länge zu halten. Der zweite bettet einfach die gewünschte Länge in %code% body ein.

%Vor%

Ausgabe

%Vor%

Im ersten Beispiel könnten Sie auch tun:

%Vor%

Ebenso können Sie im zweiten Beispiel das Literal %code% durch eine lokale (oder globale) Variable ersetzen, zB:

%Vor%     
___ answer34610141 ___

Was Sie zu tun versuchen, ist bekannt als Teilfunktionsanwendung : Sie haben eine Funktion mit mehreren Argumenten (in dieser case, 2) und möchte eine davon abgeleitete Funktion mit einem oder mehreren fixen Argumenten erhalten, die Sie dann an %code% übergeben können.

Einige Sprachen (besonders funktionale) haben diese Funktionalität "eingebaut". In Python können Sie dafür lambdas verwenden (wie andere gezeigt haben) oder Sie können die %code% -Bibliothek . Insbesondere %code% :

  

Das partielle () wird für die Anwendung einer Teilfunktion verwendet, die einen Teil der Argumente und / oder Schlüsselwörter einer Funktion "einfriert", was zu einem neuen Objekt mit einer vereinfachten Signatur führt. Beispielsweise kann partial () verwendet werden, um ein Callable zu erstellen, das sich wie die Funktion int () verhält, wobei das Basisargument standardmäßig zwei ist:

%Vor%

So können Sie tun:

%Vor%     
___ qstntxt ___

Gegeben die folgende Liste:

%Vor%

Ich möchte Strings länger als 3 Zeichen filtern. Ich erreiche das mit dem folgenden Code:

Mit for-Schleife:

%Vor%

Aber ich möchte, dass mein Code allgemeiner ist, damit ich später Strings beliebiger Länge filtern kann, also verwende ich eine Funktion und eine for-Schleife:

%Vor%

Ich möchte die gleiche Allgemeinheit mit %code% erreichen, aber das kann ich nicht erreichen. Wenn ich die obige Funktion %code% verwende, kann ich einfach keine Argumente an sie übergeben, wenn ich sie mit %code% verwende. Ist es einfach nicht möglich oder gibt es einen Weg um es herum?

Mein Code mit %code% für den speziellen Fall:

%Vor%     
___ answer34618630 ​​___

Sie könnten immer ein Callable erstellen, das eine Callback-Funktion zurückgibt, die für Vergleiche von %code% geeignet ist, wie das folgende Beispiel zeigt:

%Vor%     
___ tag123python27 ___ Python 2.7 soll die letzte Hauptversion der 2.x-Reihe sein. Verwenden Sie dieses Tag nicht einfach, um die von Ihnen verwendete Python-Version zu vermitteln, es sei denn, die Frage bezieht sich auf ein Python 2.7-spezifisches Problem. Verwenden Sie das allgemeinere [python] -Tag. ___ answer43220796 ___

Sie können einen allgemeineren Fall haben.

Da function ein Objekt in Python ist, können Sie eine andere Funktion erstellen, die die gewünschte Funktion zurückgibt.

%Vor%

Das g ist, was Sie wirklich wollen und f ist die Funktion, die es erzeugt.

    
___ tag123python ___ Python ist eine dynamische und stark typisierte Programmiersprache, die die Usability betont. Zwei ähnliche, aber größtenteils inkompatible Versionen von Python sind weit verbreitet (2 und 3). Wenn Sie eine versionsspezifische Python-Frage haben, sollten Sie die Tags [python-2.7] oder [python-3.x] zusätzlich zum Tag [python] verwenden. Wenn Sie eine Python-Variante wie jython, pypy, iron-python usw. verwenden, kennzeichnen Sie diese bitte entsprechend. ___ tag123list ___ Liste kann sich beziehen auf: eine verkettete Liste (eine geordnete Menge von Knoten, die jeweils auf ihren Nachfolger verweisen) oder eine Form eines dynamischen Arrays. Um nicht für HTML-Listen verwendet zu werden, verwenden Sie stattdessen [html-lists]. ___ answer34610648 ___

Müssen Sie %code% verwenden? Warum nicht ein mehr pythonisches Listenverständnis verwenden?

Beispiel:

%Vor%

Diese Methode hat den Vorteil, dass es trivial ist, sie in einen Generator umzuwandeln, der abhängig von Ihrer Anwendung, z. Wenn Sie viele DNA-Sequenzen haben und diese durchlaufen wollen, wird die Realisierung als Liste sehr viel Speicher auf einmal verbrauchen. Der äquivalente Generator muss lediglich die eckigen Klammern %code% durch runde Klammern ersetzen %code% :

%Vor%

In Python 2 ist diese Leistungsverbesserung keine Option mit %code% , weil sie eine Liste zurückgibt. In Python gibt 3 %code% ein Filterobjekt zurück, das einem Generator ähnlicher ist.

    
___
Noctis Skytower 05.01.2016 18:21
quelle
0

Sie können einen allgemeineren Fall haben.

Da function ein Objekt in Python ist, können Sie eine andere Funktion erstellen, die die gewünschte Funktion zurückgibt.

%Vor%

Das g ist, was Sie wirklich wollen und f ist die Funktion, die es erzeugt.

    
Statham 05.04.2017 02:28
quelle

Tags und Links