假设我们有一个函数add如下所示

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

我们想为数组应用map函数

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

语义是我想给数组的每个元素加2。但是map函数在第三个参数中也需要一个列表。

注意:为了简单起见,我使用了添加示例。原来的函数要复杂得多。当然,在add函数中设置y的默认值是不可能的,因为每次调用都会改变它。


当前回答

如果您有它可用,我会考虑使用numpy。对于这些类型的操作,它非常快:

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

这是假设您的实际应用程序正在执行数学操作(可以向量化)。

其他回答

有时我解决类似的情况(比如使用熊猫。应用方法)使用闭包

为了使用它们,定义一个函数,动态定义并返回函数的包装器,有效地使其中一个参数成为常量。

就像这样:

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

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

然后,add_constant(y)返回一个函数,可用于将y添加到任何给定值:

>>> add_constant(2)(3)
5

这允许你在每次给出一个参数的任何情况下使用它:

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

edit

如果你不想在其他地方写闭包函数,你总是可以使用lambda函数动态地构建它:

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

使用列表推导式。

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

如果你真的,真的,真的想使用map,给它一个匿名函数作为第一个参数:

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

一个选项是列表推导式:

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

更多的选择:

a = [1, 2, 3]

import functools
map(functools.partial(add, y=2), a)

import itertools
map(add, a, itertools.repeat(2, len(a)))
def func(a, b, c, d):
 return a + b * c % d
map(lambda x: func(*x), [[1,2,3,4], [5,6,7,8]])

通过用lambda包函数调用并使用星号解包,可以使用任意数量的参数进行map。

你可以将lambda和map一起包含:

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