Wie verkettet Python Karten und Filter?

8

Ich lerne gerade Python (kommt aus anderen Sprachen wie JavaScript und Ruby). Ich bin es gewohnt, eine Reihe von Transformationen / Filtern zu verketten, aber ich bin mir ziemlich sicher, dass das in Python nicht der richtige Weg ist: filter nimmt ein Lambda vor dem Enumerable, also sieht das Schreiben einer langen / mehrzeiligen Funktion aus wirklich komisch und sie zu verketten bedeutet, sie in umgekehrter Reihenfolge zu bringen, die nicht lesbar ist.

Was wäre der "Python-Weg" zum Schreiben der Karten und Filter in dieser JavaScript-Funktion?

%Vor%

Ich verstehe, dass ich ein Listenverständnis für die erste Karte und die nächsten zwei Filter verwenden könnte, aber ich bin mir nicht sicher, wie ich die letzte Karte machen soll und wie ich alles zusammenstellen soll.

Danke!

    
Edward 18.07.2014, 18:22
quelle

4 Antworten

4

Ein guter Weg, dies zu tun, besteht darin, mehrere Filter / Maps zu einem einzigen Generatorverständnis zu kombinieren. In Fällen, in denen dies nicht möglich ist, definieren Sie eine Zwischenvariable für die Zwischenkarte / den Filter, die Sie benötigen, anstatt zu versuchen, die Karten in eine einzelne Kette zu zwingen. Zum Beispiel:

%Vor%

Beachten Sie, dass die eigentliche Anwendung der Karten und Filter in den letzten beiden Zeilen erfolgt. Der frühere Teil definiert nur die Funktionen, die die Karten und Filter kodieren.

Das zweite Generatorverständnis macht die letzten zwei Filter und die Karte alle zusammen. Die Verwendung von Generator-Comprehensions bedeutet, dass jedes Originalelement in inventory träge gemappt / gefiltert wird. Es wird nicht die gesamte Liste vorverarbeiten, daher ist es wahrscheinlich besser, wenn die Liste groß ist.

Beachten Sie, dass es keine Python-Entsprechung zum Definieren langer Funktionen wie in Ihrem JavaScript-Beispiel gibt. Sie können diesen komplexen Filter (der mit item.type == "cake" ) nicht inline angeben. Stattdessen müssen Sie wie in meinem Beispiel gezeigt als separate Funktion definieren, genau wie Sie es mit is_in_stock und as_item getan haben.

(Der Grund für die Aufteilung der ersten Karte besteht darin, dass Filter erst nach der Zuordnung auf die zugeordneten Daten einwirken können. Sie könnten zu einer kombiniert werden, aber dazu müsste die as_item -Karte innerhalb des Verständnisses manuell neu erstellt werden:

%Vor%

Es ist klarer, diese Karte einfach zu trennen.)

    
BrenBarn 18.07.2014, 18:36
quelle
3

benutze Iteratoren (in Python 3 sind all diese Funktionen Iteratoren in python2, du musst itertools.imap und itertools.ifilter verwenden)

%Vor%     
Joran Beasley 18.07.2014 18:37
quelle
2

Wenn es Ihnen nichts ausmacht, ein Paket zu verwenden, können Sie dies auch mit Ссылка

tun %Vor%

Wie bereits erwähnt, können Sie in python lamdba-Ausdrücke verwenden, die jedoch in JavaScript nicht als Clojure fungieren, da sie nicht mehr als eine Anweisung enthalten können. Eine weitere nervige Python-Sache ist die Notwendigkeit von Backslashes. Davon abgesehen, denke ich, spiegelt das oben Gesagte am meisten, was Sie ursprünglich gepostet haben.

Haftungsausschluss: Ich bin der Autor des obigen Pakets

    
Keiga 04.06.2016 17:00
quelle
-1

Definieren Sie Ihre eigene funktionelle Zusammensetzung Meta-Funktion ist ziemlich einfach. Sobald Sie das haben, ist das Verketten von Funktionen auch sehr einfach.

%Vor%

Wenn Sie mit Iteratoren noch nicht vertraut sind, würde ich es auffrischen, wenn ich Sie wäre (etwas wie Ссылка ist gut).

    
metaperture 18.07.2014 18:40
quelle

Tags und Links