Wie kann man mehrere Argumente zur Kartenfunktion machen, wo man in Python gleich bleibt?

Lass uns sagen, wir haben eine Funktion wie folgt hinzufügen

def add(x, y): return x + y 

Wir möchten die Kartenfunktion für ein Array anwenden

 map(add, [1, 2, 3], 2) 

Die Semantik möchte ich 2 zu jedem Element des Arrays hinzufügen. Aber die map benötigt auch eine Liste im dritten Argument.

Anmerkung: Ich stelle das Hinzufügen Beispiel für die Einfachheit. Meine ursprüngliche Funktion ist viel komplizierter. Und natürlich ist die Möglichkeit, den Standardwert von y in der Add-Funktion zu setzen, ausgeschlossen, da sie für jeden Anruf geändert wird.

10 Solutions collect form web for “Wie kann man mehrere Argumente zur Kartenfunktion machen, wo man in Python gleich bleibt?”

Eine Option ist ein Listenverständnis:

 [add(x, 2) for x in [1, 2, 3]] 

Mehr Optionen:

 a = [1, 2, 3] import functools map(functools.partial(add, y=2), a) import itertools map(add, a, itertools.repeat(2, len(a))) 

Verwenden Sie ein Listenverständnis.

 [x + 2 for x in [1, 2, 3]] 

Wenn Sie wirklich , wirklich , wirklich wollen, um map zu verwenden, geben Sie ihm eine anonyme Funktion als das erste Argument:

 map(lambda x: x + 2, [1,2,3]) 

Die docs explizit vorschlagen, dies ist die wichtigste Verwendung für itertools.repeat :

Machen Sie einen Iterator, der das Objekt immer wieder zurückgibt. Läuft auf unbestimmte Zeit, es sei denn, das Zeitargument ist angegeben. Wird als Argument für map() für invariante Parameter zur aufgerufenen Funktion verwendet. Auch mit zip() , um einen invarianten Teil eines Tupelsatzes zu erstellen.

Und es gibt keinen Grund für Pass len([1,2,3]) wie die times Argument; map stoppt, sobald das erste iterable verbraucht wird, also ein unendliches iterable ist ganz gut:

 >>> from operator import add >>> from itertools import repeat >>> list(map(add, [1,2,3], repeat(4))) [5, 6, 7] 

In der Tat ist dies gleichbedeutend mit dem Beispiel für die repeat in den docs:

 >>> list(map(pow, range(10), repeat(2))) [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] 

Dies macht für eine schöne faul-funktionale-Sprache-y-Lösung, die auch perfekt in Python-Iterator Begriffe lesbar ist.

Wenn Sie es verfügbar haben, würde ich erwägen, numpy zu verwenden. Es ist sehr schnell für diese Art von Operationen:

 >>> import numpy >>> numpy.array([1,2,3]) + 2 array([3, 4, 5]) 

Dies geht davon aus, dass Ihre reale Anwendung mathematische Operationen durchführt (die vektorisiert werden können).

Manchmal habe ich ähnliche Situationen (wie mit pandas.apply Methode) mit Verschlüssen gelöst

Um sie zu benutzen, definieren Sie eine Funktion, die dynamisch definiert und einen Wrapper für Ihre Funktion zurückgibt, indem Sie einen der Parameter konstant machen.

Etwas wie das:

 def add(x, y): return x + y def add_constant(y): def f(x): return add(x, y) return f 

Dann gibt add_constant(y) eine Funktion zurück, die verwendet werden kann, um y zu einem beliebigen Wert hinzuzufügen:

 >>> add_constant(2)(3) 5 

Welches erlaubt Ihnen, es in jeder möglicher Situation zu verwenden, in der Parameter ein einzeln gegeben werden:

 >>> map(add_constant(2), [1,2,3]) [3, 4, 5] 

bearbeiten

Wenn Sie nicht wollen, um die Schließung Funktion irgendwo anders zu schreiben, haben Sie immer die Möglichkeit, es auf der Fliege mit einer Lambda-Funktion zu bauen:

 >>> map(lambda x: add(x, 2), [1, 2, 3]) [3, 4, 5] 

Wenn du wirklich die Kartenfunktion benutzen musst (wie meine Klassenzuordnung hier …), kannst du eine Wrapper-Funktion mit 1 Argument verwenden, den Rest dem Original in seinem Körper übergeben; Dh:

 extraArguments = value def myFunc(arg): # call the target function return Func(arg, extraArguments) map(myFunc, itterable) 

Dirty & hässlich, macht immer noch den Trick

Die richtige Antwort ist einfacher als du denkst. Einfach tun:

 map(add, [(x, 2) for x in [1,2,3]]) 

Und ändern Sie die Implementierung von add, um ein Tupel zu nehmen

 def add(t): x, y = t return x+y 

Dies kann jeden komplizierten Anwendungsfall behandeln, bei dem beide Parameter dynamisch sind.

Karte kann mehrere Argumente enthalten, die Standardweise ist

 map(add, a, b) 

In deiner Frage sollte es sein

 map(add, a, [2]*len(a)) 

Um mehrere Argumente an eine map .

 def q(x,y): return x*y print map (q,range(0,10),range(10,20)) 

Hier ist q Funktion mit mehreren Argumenten, die map () Anrufe. Stellen Sie sicher, dass die Länge der beiden Bereiche

 len (range(a,a')) and len (range(b,b')) are equal. 

Eine weitere Option ist:

 results = [] for x in [1,2,3]: z = add(x,2) ... results += [f(z,x,y)] 

Dieses Format ist sehr nützlich beim Aufruf mehrerer Funktionen.

Python ist die beste Programmiersprache der Welt.