python : reduzieren können übersetzt werden in die Liste Verstehens wie map, lambda-und filter?
Bei der Programmierung in python, die ich jetzt vermeiden map
, lambda
und filter
durch die Liste Verstehens, weil es einfacher zu Lesen und schneller in der Ausführung. Aber kann reduce
ersetzt werden, wie gut?
E. g. ein Objekt hat ein Betreiber union()
funktioniert auf einem anderen Objekt, a1.union(a2)
, und gibt ein 3. Objekt von gleichen Typ.
Habe ich eine Liste von Objekten:
L = [a1, a2, a3, ...]
Wie die union () - all diese Objekte mit Liste Verstehens, das entspricht:
result = reduce(lambda a, b :a.union(b), L[1:], L[0])
- In manchen Fällen: keine. Aber hängt. Bitte geben Sie eine spezifische Abfrage, die Sie im Sinn haben
- Beispiele dafür?
- Setzen die Gewerkschaften sind ein schlechtes Beispiel, denn Sie können einfach tun
result = set().union(*L)
, das hat den Vorteil, dass die Arbeit, auch wenn L wird eine leere Liste. Jedenfallslambda a, b :a.union(b)
geschrieben werden kann prägnanter alsset.union
, da in pythonobj.method(args)
ist das gleiche wiecls.method(obj, args)
- Guido sagt, um eine for-Schleife verwenden anstelle von reduzieren. Er ist kein fan von FP-Konstrukte.
InformationsquelleAutor Eric H. | 2014-06-25
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist kein Geheimnis, dass die Verringerung ist nicht unter die bevorzugten Funktionen von den Pythonistas.
Generisch, reduzieren ist ein linke Falte auf eine Liste
Es ist konzeptionell einfach zu schreiben, eine Falte in Python, das wird klappen Links oder rechts auf ein iterierbar:
Ohne schwachen hack, dies kann nicht repliziert werden, in einem Verständnis, weil es ist nicht Akku-Typ Funktion in ein Verständnis.
Nur verwenden, verringern -- oder schreiben, das macht mehr Sinn.
Nicht wirklich. Liste Verstehens sind ähnlich
map
, und möglicherweisefilter
.Da eine Liste Verständnis definitionally erzeugt eine weitere Liste, Sie können es nicht verwenden, zum generieren von einem einzigen Wert. Das sind nicht für, dass. (Naja... es ist diese fiesen trick verwendet, die eine durchgesickerte detail in alten Versionen von python, die es tun können. Ich bin nicht einmal zum kopieren der Beispiel-code hier. Tun Sie das nicht.)
Wenn Sie sind besorgt über die stilistischen Aspekte der
reduce()
und seinesgleichen, nicht sein. Benennen Sie Ihre Reduzierungen und Sie werden in Ordnung sein. So, während:ist nicht so toll, dieses:
ist ziemlich klar.
Wenn Sie sind besorgt über Geschwindigkeit, check-out die toolz und cytoolz - Pakete, die sind "schnell" und "wahnsinnig schnell" bezeichnet. Auf große Datenbestände, werden Sie oft lassen Sie vermeiden die Verarbeitung Ihrer Daten mehr als einmal oder laden Sie die ganze Reihe im Speicher auf einmal, im Gegensatz zu Liste Verstehens.
reduce()
Ausdruck selbst lesbar, machen das erste argument nicht ein lambda. Zum Beispiel:reduce(set.union, <list of sets>)
Manchmal wird von Ihnen verlangen, zu definieren (und somit Namen) der Betreiber irgendwo außerhalb der Aufrufreduce
.Einer gemeinsamen Nutzung zu reduzieren, ist zu reduzieren, eine Liste von Listen. Sie können eine Liste mit Verständnis statt.
mit reduzieren
mit list comp
Wenn Ihr problem kann gelöst werden, indem Sie die auf der flachen Liste, dies ist ein effektiver Ersatz. Kontrast-diese one-Liner, die für das gegebene Beispiel:
sum(L, [])
. Das heißt, die Summe/list comprehension erzeugt einen "full-length" - Liste, woreduce(operator.or_, map(set, L), set())
würde nicht.