如何对 map 函数执行多个参数,其中一个参数保持不变
- 2025-03-10 08:52:00
- admin 原创
- 71
问题描述:
假设我们有一个add
如下函数
def add(x, y):
return x + y
我们想要对数组应用 map 函数
map(add, [1, 2, 3], 2)
语义是我想将数组的每个元素加 2。但该map
函数还需要第三个参数中的列表。
注意:我举这个add
例子是为了简单起见。我原来的函数要复杂得多。当然,在函数y
中设置默认值的选项add
是不可能的,因为它会在每次调用时改变。
解决方案 1:
一个选项是列表理解:
[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)))
解决方案 2:
文档明确指出这是的主要用途itertools.repeat
:
创建一个反复返回对象的迭代器。除非指定 times 参数,否则将无限期运行。用作
map()
被调用函数的不变参数的参数。还用于zip()
创建元组记录的不变部分。
并且没有理由将 passlen([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]
这是一个很好的惰性函数式语言解决方案,而且在 Python 迭代器术语中也完全可读。
解决方案 3:
使用列表推导。
[x + 2 for x in [1, 2, 3]]
如果您真的、真的、真的想使用map
,请给它一个匿名函数作为第一个参数:
map(lambda x: x + 2, [1,2,3])
解决方案 4:
Map 可以包含多个参数,标准方式是
map(add, a, b)
在你的问题中,应该是
map(add, a, [2]*len(a))
解决方案 5:
正确答案比你想象的要简单。只需这样做:
map(add, [(x, 2) for x in [1,2,3]])
并改变 add 的实现来获取一个元组,即
def add(t):
x, y = t
return x+y
这可以处理任何添加参数都是动态的复杂用例。
解决方案 6:
有时我使用闭包来解决类似的情况(例如使用pandas.apply方法)
为了使用它们,您需要定义一个函数,该函数动态定义并返回函数的包装器,从而有效地使其中一个参数成为常量。
像这样:
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 函数动态构建它:
>>> map(lambda x: add(x, 2), [1, 2, 3])
[3, 4, 5]
解决方案 7:
如果你有的话,我会考虑使用 numpy。它对于这些类型的操作非常快:
>>> import numpy
>>> numpy.array([1,2,3]) + 2
array([3, 4, 5])
这是假设您的实际应用程序正在执行数学运算(可以矢量化)。
解决方案 8:
如果你真的需要使用 map 函数(比如我这里的课堂作业...),你可以使用一个带有 1 个参数的包装函数,将其余参数传递给其主体中的原始函数;即:
extraArguments = value
def myFunc(arg):
# call the target function
return Func(arg, extraArguments)
map(myFunc, itterable)
又脏又丑,但仍然管用
解决方案 9:
我相信星图就是你所需要的:
from itertools import starmap
def test(x, y, z):
return x + y + z
list(starmap(test, [(1, 2, 3), (4, 5, 6)]))
解决方案 10:
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 包装函数调用并使用星号解包,您可以使用任意数量的参数进行映射。
解决方案 11:
您可以将 lambda 与 map 一起包含:
list(map(lambda a: a+2, [1, 2, 3]))
解决方案 12:
向函数传递多个参数map
。
def q(x,y):
return x*y
print map (q,range(0,10),range(10,20))
这里q是map()调用的带有多个参数的函数。确保两个范围的长度,即
len (range(a,a')) and len (range(b,b')) are equal.
解决方案 13:
在 :nums = [1, 2, 3]
在 :map(add, nums, [2]*len(nums))
出去:[3, 4, 5]
解决方案 14:
另一个选择是:
results = []
for x in [1,2,3]:
z = add(x,2)
...
results += [f(z,x,y)]
这种格式在调用多个函数时非常有用。
解决方案 15:
#multi argument
def joke(r):
if len(r)==2:
x, y = r
return x + y
elif len(r)==3:
x,y,z=r
return x+y+z
#using map
print(list(map(joke,[[2,3],[3,4,5]])))
输出 = [6,12]
如果情况与上述类似,并且只想使用函数
def add(x,y):
ar =[]
for xx in x:
ar.append(xx+y)
return ar
print(list(map(add,[[3,2,4]],[2]))[0])
output = [5,4,6]
注:您可以根据需要进行修改。
扫码咨询,免费领取项目管理大礼包!