Hat hier jemand nützlichen Code, der die Funktion redu () in Python verwendet? Gibt es einen anderen Code als die üblichen + und *, die wir in den Beispielen sehen?
Siehe Fate of redu () in Python 3000 von GvR
Hat hier jemand nützlichen Code, der die Funktion redu () in Python verwendet? Gibt es einen anderen Code als die üblichen + und *, die wir in den Beispielen sehen?
Siehe Fate of redu () in Python 3000 von GvR
from functools import reduce
ermöglicht den gleichen Code auf Python 2 und 3.Antworten:
Die anderen Verwendungen, die ich neben + und * dafür gefunden habe, waren mit und und oder, aber jetzt haben
any
und müssen wirall
diese Fälle ersetzen.foldl
undfoldr
kommen oft in Schema ...Hier sind einige nette Verwendungen:
Reduzieren Sie eine Liste
Ziel: verwandeln
[[1, 2, 3], [4, 5], [6, 7, 8]]
in[1, 2, 3, 4, 5, 6, 7, 8]
.Liste der Ziffern einer Zahl
Ziel: verwandeln
[1, 2, 3, 4, 5, 6, 7, 8]
in12345678
.Hässlicher, langsamer Weg:
Schöner
reduce
Weg:quelle
timeit.repeat('int("".join(map(str, digit_list)))', setup = 'digit_list = list(d%10 for d in xrange(1,1000))', number=1000)
dauert ~ 0,09 Sekunden, während estimeit.repeat('reduce(lambda a,d: 10*a+d, digit_list)', setup = 'digit_list = list(d%10 for d in xrange(1,1000))', number=1000)
0,36 Sekunden dauert (ungefähr 4-mal langsamer). Grundsätzlich wird die Multiplikation mit 10 teuer, wenn die Liste groß wird, während int to str und Verkettung billig bleiben.timeit.repeat('convert_digit_list_to_int(digit_list)', setup = 'digit_list = [d%10 for d in xrange(1,10)]\ndef convert_digit_list_to_int(digits):\n i = 0\n for d in digits:\n i = 10*i + d\n return i', number=100000)
dauert das Vermeiden des Reduzierens und Ausführen einer einfachen Schleife noch schneller 0,06 s,timeit.repeat('reduce(lambda a,d: 10*a+d, digit_list)', setup = 'digit_list = list(d%10 for d in xrange(1,10))', number=100000)
dauert 0,12 s und das Konvertieren von Ziffern in die str-Methode dauert 0,16 s.reduce()
kann verwendet werden, um das kleinste gemeinsame Vielfache für 3 oder mehr Zahlen zu finden :Beispiel:
quelle
lcm
in der zweiten Zeile?lcm()
Gibt das kleinste gemeinsame Vielfache von zwei Zahlen zurück.reduce()
könnte verwendet werden, um gepunktete Namen aufzulösen (woeval()
die Verwendung zu unsicher ist):quelle
Finden Sie den Schnittpunkt von N gegebenen Listen:
kehrt zurück:
via: Python - Schnittpunkt zweier Listen
quelle
Ich denke reduzieren ist ein dummer Befehl. Daher:
quelle
Die Verwendung
reduce
, die ich in meinem Code gefunden habe, beinhaltete die Situation, in der ich eine Klassenstruktur für logische Ausdrücke hatte und eine Liste dieser Ausdrucksobjekte in eine Konjunktion der Ausdrücke konvertieren musste. Ich hatte bereits die Funktionmake_and
, eine Konjunktion mit zwei Ausdrücken zu erstellen, also schrieb ichreduce(make_and,l)
. (Ich wusste, dass die Liste nicht leer war; sonst wäre es so etwas gewesenreduce(make_and,l,make_true)
.)Dies ist genau der Grund, warum (einige) Funktionsprogrammierer Funktionen mögen
reduce
(oder falten , wie solche Funktionen normalerweise genannt werden). Oft gibt es bereits viele binären Funktionen wie+
,*
,min
,max
, Verkettung und in meinem Fall,make_and
undmake_or
. Mit areduce
ist es trivial, diese Operationen auf Listen zu heben (oder auf Bäume oder was auch immer Sie haben, für Falzfunktionen im Allgemeinen).Wenn bestimmte Instanziierungen (z. B.
sum
) häufig verwendet werden, möchten Sie natürlich nicht weiter schreibenreduce
. Anstatt dassum
mit einer for-Schleife zu definieren, können Sie es genauso einfach mit definierenreduce
.Die Lesbarkeit ist, wie von anderen erwähnt, in der Tat ein Problem. Sie könnten jedoch argumentieren, dass der einzige Grund, warum Menschen
reduce
weniger "klar" finden, darin besteht, dass es sich nicht um eine Funktion handelt, die viele Menschen kennen und / oder nutzen.quelle
and
Bedieners ausnutzen :L and reduce(make_and, L)
Wenn die Rückgabe einer leeren Liste in diesem Fall angemessen istFunktionszusammensetzung : Wenn Sie bereits eine Liste von Funktionen haben, die Sie nacheinander anwenden möchten, z.
Dann können Sie sie alle nacheinander anwenden mit:
In diesem Fall ist die Methodenverkettung möglicherweise besser lesbar. Aber manchmal ist es nicht möglich, und diese Art von Komposition ist möglicherweise besser lesbar und wartbar als eine
f1(f2(f3(f4(x))))
Art Syntax.quelle
Sie könnten ersetzen
value = json_obj['a']['b']['c']['d']['e']
durch:Wenn Sie den Pfad bereits
a/b/c/..
als Liste haben. Ändern Sie beispielsweise die Werte im Diktat verschachtelter Diktate mithilfe von Elementen in einer Liste .quelle
@Blair Conrad: Sie können Ihren Glob / Reduce auch mit sum implementieren, wie folgt:
Dies ist weniger ausführlich als eines Ihrer beiden Beispiele, perfekt pythonisch und immer noch nur eine Codezeile.
Um die ursprüngliche Frage zu beantworten, versuche ich persönlich, die Verwendung von Reduzieren zu vermeiden, da dies nie wirklich notwendig ist und ich finde, dass es weniger klar ist als andere Ansätze. Einige Leute gewöhnen sich jedoch daran, das Verständnis zu reduzieren, und ziehen es vor, es aufzulisten (insbesondere Haskell-Programmierer). Wenn Sie jedoch noch nicht über ein Problem in Bezug auf die Reduzierung nachdenken, müssen Sie sich wahrscheinlich keine Gedanken über die Verwendung machen.
quelle
sum
undreduce
führen zu quadratischem Verhalten. Dies kann in linearer Zeit erfolgen :files = chain.from_iterable(imap(iglob, args))
. Obwohl es in diesem Fall wahrscheinlich keine Rolle spielt, da glob () Zeit benötigt, um auf eine Festplatte zuzugreifen.reduce
kann verwendet werden, um die Suche nach verketteten Attributen zu unterstützen:Dies ist natürlich gleichbedeutend mit
Dies ist jedoch nützlich, wenn Ihr Code eine beliebige Liste von Attributen akzeptieren muss.
(Verkettete Attribute beliebiger Länge sind beim Umgang mit Django-Modellen häufig.)
quelle
reduce
ist nützlich, wenn Sie die Vereinigung oder den Schnittpunkt einer Folge vonset
ähnlichen Objekten finden müssen.(Abgesehen von tatsächlichen
set
s sind ein Beispiel dafür Djangos Q-Objekte .)Auf der anderen Seite, wenn Sie es zu tun
bool
s, sollten Sie verwendenany
undall
:quelle
Nach dem Durchsuchen meines Codes scheint das einzige, wofür ich Reduzieren verwendet habe, die Berechnung der Fakultät zu sein:
quelle
Ich schreibe eine Kompositionsfunktion für eine Sprache, daher konstruiere ich die Kompositionsfunktion mit reduct zusammen mit meinem Apply-Operator.
Kurz gesagt, compose enthält eine Liste von Funktionen, die zu einer einzigen Funktion zusammengesetzt werden sollen. Wenn ich eine komplexe Operation habe, die schrittweise angewendet wird, möchte ich alles so zusammensetzen:
Auf diese Weise kann ich es dann auf einen Ausdruck wie folgt anwenden:
Und ich möchte, dass es gleichbedeutend ist mit:
Um nun meine internen Objekte zu erstellen, möchte ich sagen:
(Die Lambda-Klasse erstellt eine benutzerdefinierte Funktion und Apply erstellt eine Funktionsanwendung.)
Reduzieren Sie jetzt leider die Falte in die falsche Richtung, so dass ich ungefähr verwendet habe:
Probieren Sie diese in der REPL aus, um herauszufinden, welche Reduzierungen entstehen:
quelle
compose = lambda *func: lambda arg: reduce(lambda x, f: f(x), reversed(funcs), arg)
um alle möglichen Kombinationen von Funktionen für Performance - Tests zu erzeugen.Mit reduzieren kann die Liste mit dem maximalen n-ten Element abgerufen werden
würde [5, 2, 5, 7] zurückgeben, da es sich um die Liste mit maximalem 3. Element + handelt
quelle
Reduzieren ist nicht auf skalare Operationen beschränkt. Es kann auch verwendet werden, um Dinge in Eimer zu sortieren. (Dies ist, was ich am häufigsten reduzieren verwenden).
Stellen Sie sich einen Fall vor, in dem Sie eine Liste von Objekten haben und diese hierarchisch neu organisieren möchten, basierend auf Eigenschaften, die flach im Objekt gespeichert sind. Im folgenden Beispiel erstelle ich mit der
articles
Funktion eine Liste von Metadatenobjekten, die sich auf Artikel in einer XML-codierten Zeitung beziehen .articles
generiert eine Liste von XML-Elementen und ordnet sie dann einzeln zu, wobei Objekte erstellt werden, die einige interessante Informationen über sie enthalten. Am Frontend möchte ich den Benutzer die Artikel nach Abschnitt / Unterabschnitt / Überschrift durchsuchen lassen. Daher verwende ichreduce
die Liste der Artikel und gebe ein einzelnes Wörterbuch zurück, das die Hierarchie von Abschnitten / Unterabschnitten / Artikeln widerspiegelt.Ich gebe hier beide Funktionen an, weil ich denke, dass es zeigt, wie sich Map und Reduce im Umgang mit Objekten gut ergänzen können. Dasselbe hätte mit einer for-Schleife erreicht werden können, ... aber einige ernsthafte Zeit mit einer funktionalen Sprache zu verbringen, hat mich dazu gebracht, in Bezug auf Karte und Reduzierung zu denken.
Übrigens, wenn jemand eine bessere Möglichkeit hat, Eigenschaften festzulegen, als ich es tue
extract
, bei denen die Eltern der Eigenschaft, die Sie festlegen möchten, möglicherweise noch nicht existieren, lassen Sie es mich bitte wissen.quelle
Sie sind sich nicht sicher, ob Sie danach suchen, aber Sie können den Quellcode bei Google suchen .
Folgen Sie dem Link für eine Suche nach "function: redu () lang: python" in der Google Code-Suche
Auf den ersten Blick verwenden folgende Projekte
reduce()
etc. etc. aber dann sind diese kaum überraschend, da es sich um riesige Projekte handelt.
Die Funktionalität der Reduzierung kann mithilfe der Funktionsrekursion erfolgen, die Guido meiner Meinung nach expliziter fand.
Aktualisieren:
Da die Codesuche von Google am 15. Januar 2012 eingestellt wurde, gibt es neben der Rückkehr zur regulären Google-Suche eine vielversprechende Code-Snippets-Sammlung . Eine Reihe anderer Ressourcen werden in Antworten auf diese (geschlossene) Frage erwähnt. Ersatz für Google Code Search? .
Update 2 (29. Mai 2017):
Eine gute Quelle für Python-Beispiele (im Open-Source-Code) ist die Nullege-Suchmaschine .
quelle
for
Schleife.lang:python "reduce("
werden Definitionen gefunden, die vomreduce
Codierungsstil des Quellcodes abhängen.quelle
quelle
Ich habe
reduce
eine Liste von PostgreSQL-||
Suchvektoren mit dem Operator in sqlalchemy-searchable verkettet:quelle
Ich habe eine alte Python-Implementierung von pipegrep , die reduct und das glob-Modul verwendet, um eine Liste der zu verarbeitenden Dateien zu erstellen:
Ich fand es damals praktisch, aber es ist wirklich nicht notwendig, da etwas Ähnliches genauso gut und wahrscheinlich besser lesbar ist
quelle
files = [glob.glob(f) for f in args]
itertools
, dasflatten()
Rezept unter Verwendung des Rezepts aus docs.python.org/library/itertools.html zu importieren und dann zu schreiben:files = flatten(glob.glob(f) for f in args)
(Und dieses Mal habe ich den Code vor dem Posten getestet und weiß, dass dies korrekt funktioniert.)files = chain.from_iterable(imap(iglob, args))
wherechain
,imap
are fromitertools
module undglob.iglob
ist nützlich, wenn ein Muster vonargs
Dateien aus mehreren Verzeichnissen ergeben kann.Angenommen, es sind einige jährliche Statistikdaten in einer Liste von Zählern gespeichert. Wir möchten die MIN / MAX-Werte in jedem Monat über die verschiedenen Jahre hinweg ermitteln. Zum Beispiel wäre es für Januar 10. Und für Februar wäre es 15. Wir müssen die Ergebnisse in einem neuen Zähler speichern.
quelle
Ich habe Objekte, die eine Art überlappender Intervalle darstellen (genomische Exons), und habe ihre Schnittmenge neu definiert mit
__and__
:Wenn ich dann eine Sammlung davon habe (zum Beispiel im selben Gen), benutze ich
quelle
Ich habe gerade eine nützliche Verwendung von
reduce
: Teilen von Zeichenfolgen gefunden, ohne das Trennzeichen zu entfernen . Der Code stammt vollständig aus dem Blog "Programmatisch sprechend". Hier ist der Code:Hier ist das Ergebnis:
Beachten Sie, dass es Randfälle behandelt, die in SO nicht häufig beantwortet werden. Für eine ausführlichere Erklärung leite ich Sie zum ursprünglichen Blog-Beitrag weiter.
quelle
Verwenden Sie redu (), um herauszufinden, ob eine Liste von Daten aufeinanderfolgend ist:
quelle