201

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

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

我们想为数组应用映射函数

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

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

注意:为了简单起见,我add举个例子。我原来的功能要复杂得多。当然,设置yinadd函数的默认值的选项是没有问题的,因为每次调用都会更改它。

4

15 回答 15

239

一种选择是列表理解:

[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)))
于 2012-05-31T13:50:19.020 回答
87

文档明确建议这是主要用途itertools.repeat

制作一个反复返回对象的迭代器。除非指定了 times 参数,否则无限期运行。用作map()被调用函数的不变参数的参数。也用于zip()创建元组记录的不变部分。

并且没有理由通过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]

这提供了一个很好的惰性函数式语言解决方案,它在 Python 迭代器术语中也完全可读。

于 2014-11-19T19:28:42.983 回答
44

使用列表推导。

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

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

map(lambda x: x + 2, [1,2,3])
于 2012-05-31T13:50:03.503 回答
27

Map 可以包含多个参数,标准方式是

map(add, a, b)

在你的问题中,它应该是

map(add, a, [2]*len(a))
于 2016-04-19T04:39:07.593 回答
22

正确答案比你想象的要简单。只需这样做:

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

并更改 add 的实现以获取一个元组,即

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

这可以处理两个添加参数都是动态的任何复杂用例。

于 2016-04-27T11:20:08.237 回答
16

有时我使用闭包解决了类似的情况(例如使用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]
于 2015-08-18T11:56:46.300 回答
14

如果你有它,我会考虑使用 numpy. 这些类型的操作非常快:

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

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

于 2012-05-31T13:55:51.747 回答
11

如果你真的需要使用 map 函数(就像我在这里的类分配......),你可以使用一个带有 1 个参数的包装函数,将其余的传递给它的主体中的原始函数;IE :

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


map(myFunc, itterable)

又脏又丑,还是有用的

于 2014-10-06T19:35:17.707 回答
6

我相信星图是您所需要的:

from itertools import starmap


def test(x, y, z):
    return x + y + z

list(starmap(test, [(1, 2, 3), (4, 5, 6)]))
于 2019-01-09T01:16:18.850 回答
4
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 包装函数调用并使用星形解包,您可以使用任意数量的参数进行映射。

于 2018-08-29T15:37:13.560 回答
1

将多个参数传递给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.
于 2016-03-26T04:07:37.713 回答
1

在 :nums = [1, 2, 3]

在 :map(add, nums, [2]*len(nums))

出去:[3, 4, 5]

于 2018-05-23T09:10:10.307 回答
1

您可以将 lambda 与 map 一起包含:

list(map(lambda a: a+2, [1, 2, 3]))
于 2020-05-20T20:50:00.510 回答
0

另一种选择是:

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

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

于 2015-07-19T21:28:34.287 回答
-1
#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]

注意:您可以根据需要进行修改。

于 2020-08-28T09:24:03.723 回答