Disons que nous avons une fonction ajouter comme suit
def add(x, y):
return x + y
nous voulons appliquer la fonction de carte pour un tableau
map(add, [1, 2, 3], 2)
La sémantique est que je veux ajouter 2 à chaque élément du tableau. Mais la map
fonction nécessite également une liste dans le troisième argument.
Remarque: je mets l'exemple d'ajout pour plus de simplicité. Ma fonction d'origine est beaucoup plus compliquée. Et bien sûr, l'option de définir la valeur par défaut de la y
fonction d'ajout est hors de question car elle sera modifiée à chaque appel.
map(add,[1,2,3],[2]*3)
en généralmap
prend une fonction comme premier argument, et si cette fonction prend l' argument K , vous devez suivre avec K iterable:addTriple(a,b,c) -> map(addTriple,[...],[...],[...])
Réponses:
Une option est une compréhension de liste:
Plus d'options:
la source
add()
s'agit d'une fonction non trivialemap()
n'aidera pas dans les deux cas.map()
se comporte commezip_longest()
dans Python 2, alors qu'il se comporte commezip()
dans Python 3.)La documentation suggère explicitement qu'il s'agit de l'utilisation principale pour
itertools.repeat
:Et il n'y a aucune raison de passer
len([1,2,3])
pour l'times
argument;map
s'arrête dès que le premier itérable est consommé, donc un itérable infini convient parfaitement:En fait, cela équivaut à l'exemple de
repeat
la documentation:Cela en fait une belle solution de langage fonctionnel paresseux qui est également parfaitement lisible en termes d'itérateur Python.
la source
def f(x,y,z): \\ return '.'.join([x,y,z])
et ensuite:list(map(f, list('abc'), repeat('foo'), list('defgh')))
retourne['a.foo.d', 'b.foo.e', 'c.foo.f']
.repeat()
, carmap()
il s'exécutera jusqu'à ce que l' itérateur le plus long soit épuisé dans cette version de Python, en remplissantNone
toutes les valeurs manquantes. Dire qu '"il n'y a pas de raison" de passer le paramètre est faux.Utilisez une compréhension de liste.
Si vous voulez vraiment , vraiment , vraiment utiliser
map
, donnez-lui une fonction anonyme comme premier argument:la source
La carte peut contenir plusieurs arguments, la méthode standard est
Dans votre question, cela devrait être
la source
La bonne réponse est plus simple que vous ne le pensez. Faites simplement:
Et changez l'implémentation de add pour prendre un tuple ie
Cela peut gérer tout cas d'utilisation compliqué où les deux paramètres d'ajout sont dynamiques.
la source
Parfois, j'ai résolu des situations similaires (telles que l'utilisation de la méthode pandas.apply ) en utilisant des fermetures
Pour les utiliser, vous définissez une fonction qui définit et retourne dynamiquement un wrapper pour votre fonction, faisant de l'un des paramètres une constante.
Quelque chose comme ça:
Ensuite,
add_constant(y)
renvoie une fonction qui peut être utilisée pour ajoutery
à n'importe quelle valeur donnée:Ce qui vous permet de l'utiliser dans n'importe quelle situation où les paramètres sont donnés un à la fois:
Éditer
Si vous ne voulez pas avoir à écrire la fonction de fermeture ailleurs, vous avez toujours la possibilité de la construire à la volée en utilisant une fonction lambda:
la source
Si vous l'avez disponible, j'envisagerais d'utiliser numpy. C'est très rapide pour ces types d'opérations:
Cela suppose que votre application réelle effectue des opérations mathématiques (qui peuvent être vectorisées).
la source
Si vous avez vraiment besoin d'utiliser la fonction map (comme mon affectation de classe ici ...), vous pouvez utiliser une fonction wrapper avec 1 argument, en passant le reste à l'original dans son corps; c'est à dire :
Sale et laid, fait toujours l'affaire
la source
myFunc
doitreturn Func(arg, extraArguments)
Func
est le nom de votre fonction d'origine - pour OP tight seraitadd
par exempleJe crois que la carte stellaire est ce dont vous avez besoin:
la source
Pour passer plusieurs arguments à une
map
fonction.Ici, q est une fonction avec plusieurs arguments que map () appelle. Assurez-vous que la longueur des deux plages soit
la source
Dans :
nums = [1, 2, 3]
Dans :
map(add, nums, [2]*len(nums))
En dehors:
[3, 4, 5]
la source
Vous pouvez inclure lambda avec la carte:
la source
En enveloppant l'appel de fonction avec un lambda et en utilisant la décompression en étoile, vous pouvez faire une carte avec un nombre arbitraire d'arguments.
la source
Une autre option est:
Ce format est très utile lors de l'appel de plusieurs fonctions.
la source