如何做多个参数来映射函数,其中一个在python中保持不变?

可以说我们有一个function添加如下

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

我们要为数组应用map函数

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

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

注意:为了简单起见,我将添加示例。 我原来的function要复杂得多。 当然,在add函数中设置y的默认值的选项是没有问题的,因为每次调用都会改变。

一个选项是列表理解:

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

更多的select:

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

使用列表理解。

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

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

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

文档明确提出这是itertools.repeat的主要用途:

做一个迭代器,一遍又一遍地返回对象。 除非指定了times参数,否则无限期地运行。 用作map()参数给被调用函数的参数。 还与zip()一起使用来创build元组logging的不变部分。

并没有理由将len([1,2,3])作为times参数; 只要第一个迭代被消耗, map停止,所以一个无限可迭代是完全正确的:

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

实际上,这相当于文档中的repeat示例:

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

这使得一个漂亮的lazy-functional-language-y解决scheme在Python-iterator术语中也是完全可读的。

如果你有它,我会考虑使用numpy。 这些操作的速度非常快:

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

这是假设你真正的应用程序正在做math运算(可以vector化)。

如果你确实需要使用map函数(比如我的类的赋值),你可以使用一个带有1个参数的包装函数,其余的部分传递给它的正文; 即:

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

肮脏和丑陋,仍然有窍门

有时我使用闭包来解决类似的情况(比如使用pandas.apply方法)

为了使用它们,你需要定义一个函数来为你的函数dynamic地定义和返回一个包装器,使得其中一个参数是一个常量。

像这样的东西:

 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] 

编辑

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

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

正确的答案比你想象的要简单。 简单地做:

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

并改变执行添加采取一个元组即

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

这可以处理任何添加参数都是dynamic的复杂用例。

地图可以包含多个参数,标准的方式是

 map(add, a, b) 

在你的问题,应该是

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

将多个parameter passing给map函数。

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

这里qmap()调用的多个参数的函数。 请确保,这两个范围的长度即

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

另一个select是:

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

这种格式在调用多个函数时非常有用。