Nehmen wir an, wir haben eine Funktion wie folgt hinzugefügt
def add(x, y):
return x + y
Wir möchten die Map-Funktion für ein Array anwenden
map(add, [1, 2, 3], 2)
Die Semantik ist, dass ich jedem Element des Arrays 2 hinzufügen möchte. Die map
Funktion erfordert aber auch eine Liste im dritten Argument.
Hinweis: Der Einfachheit halber füge ich das Beispiel zum Hinzufügen hinzu. Meine ursprüngliche Funktion ist viel komplizierter. Die Option, den Standardwert für y
die Funktion zum Hinzufügen festzulegen, kommt natürlich nicht in Frage, da sie bei jedem Aufruf geändert wird.
map(add,[1,2,3],[2]*3)
Im Allgemeinenmap
wird eine Funktion als erstes Argument verwendet, und wenn diese Funktion ein K- Argument verwendet, müssen Sie K iterable verwenden:addTriple(a,b,c) -> map(addTriple,[...],[...],[...])
Antworten:
Eine Option ist ein Listenverständnis:
Mehr Optionen:
quelle
add()
es sich um eine nicht triviale Funktion handeltmap()
hilft der Geschwindigkeitsunterschied zwischen dem Listenverständnis nicht weiter.map()
sich das Verhalten wiezip_longest()
in Python 2 verhält, während es sich wiezip()
in Python 3 verhält .)In den Dokumenten wird ausdrücklich darauf hingewiesen, dass dies die Hauptverwendung ist für
itertools.repeat
:Und es gibt keinen Grund,
len([1,2,3])
alstimes
Argument zu gelten.map
stoppt, sobald das erste iterable verbraucht ist, so dass ein unendliches iterable vollkommen in Ordnung ist:Tatsächlich entspricht dies dem Beispiel
repeat
in den Dokumenten:Dies ergibt eine nette Lazy-Functional-Language-y-Lösung, die auch in Python-Iterator-Begriffen perfekt lesbar ist.
quelle
def f(x,y,z): \\ return '.'.join([x,y,z])
und dann:list(map(f, list('abc'), repeat('foo'), list('defgh')))
kehrt zurück['a.foo.d', 'b.foo.e', 'c.foo.f']
.repeat()
, da es ausgeführtmap()
wird, bis der längste Iterator in dieser Version von Python erschöpft ist, undNone
alle fehlenden Werte ausfüllt . Zu sagen, dass "es keinen Grund gibt", den Parameter zu übergeben, ist falsch.Verwenden Sie ein Listenverständnis.
Wenn Sie wirklich , wirklich , wirklich verwenden möchten
map
, geben Sie ihm als erstes Argument eine anonyme Funktion:quelle
Map kann mehrere Argumente enthalten, der Standardweg ist
In Ihrer Frage sollte es sein
quelle
Die richtige Antwort ist einfacher als Sie denken. Einfach machen:
Und ändern Sie die Implementierung von add, um ein Tupel zu nehmen, dh
Dies kann jeden komplizierten Anwendungsfall behandeln, bei dem beide Add-Parameter dynamisch sind.
quelle
Manchmal habe ich ähnliche Situationen (z. B. mit der Methode pandas.apply ) mithilfe von Verschlüssen gelöst
Um sie zu verwenden, definieren Sie eine Funktion, die dynamisch einen Wrapper für Ihre Funktion definiert und zurückgibt, wodurch einer der Parameter effektiv zu einer Konstanten wird.
Etwas wie das:
Dann
add_constant(y)
gibt eine Funktion , die verwendet werden kann , hinzufügeny
zu einem bestimmten Wert:So können Sie es in jeder Situation verwenden, in der Parameter einzeln angegeben werden:
bearbeiten
Wenn Sie die Closure-Funktion nicht an einer anderen Stelle schreiben möchten, haben Sie immer die Möglichkeit, sie mithilfe einer Lambda-Funktion im laufenden Betrieb zu erstellen:
quelle
Wenn Sie es zur Verfügung haben, würde ich die Verwendung von numpy in Betracht ziehen. Es ist sehr schnell für diese Art von Operationen:
Dies setzt voraus, dass Ihre reale Anwendung mathematische Operationen ausführt (die vektorisiert werden können).
quelle
Wenn Sie wirklich wirklich die Map-Funktion verwenden müssen (wie meine Klassenzuweisung hier ...), können Sie eine Wrapper-Funktion mit 1 Argument verwenden und den Rest an die ursprüngliche Funktion in ihrem Hauptteil übergeben. dh:
Schmutzig und hässlich, macht immer noch den Trick
quelle
myFunc
mussreturn Func(arg, extraArguments)
Func
ist der Name Ihrer ursprünglichen Funktion - für OP eng wäreadd
zum BeispielIch glaube, Starmap ist das, was Sie brauchen:
quelle
Übergeben mehrerer Argumente an eine
map
Funktion.Hier ist q eine Funktion mit mehreren Argumenten, die map () aufruft. Stellen Sie sicher, dass die Länge beider Bereiche dh
quelle
Im :
nums = [1, 2, 3]
Im :
map(add, nums, [2]*len(nums))
Aus:
[3, 4, 5]
quelle
Sie können Lambda zusammen mit der Karte einschließen:
quelle
Indem Sie den Funktionsaufruf mit einem Lambda umschließen und das Entpacken des Sterns verwenden, können Sie eine Zuordnung mit einer beliebigen Anzahl von Argumenten durchführen.
quelle
Eine weitere Option ist:
Dieses Format ist sehr nützlich, wenn Sie mehrere Funktionen aufrufen.
quelle