如何对 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例子是为了简单起见。我原来的函数要复...

问题描述:

假设我们有一个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]

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

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   3998  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   2749  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Freshdesk、ClickUp、nTask、Hubstaff、Plutio、Productive、Targa、Bonsai、Wrike。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在项目管理过程中面临着诸多痛点,如任务分配不...
项目管理系统   85  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Monday、TeamGantt、Filestage、Chanty、Visor、Smartsheet、Productive、Quire、Planview。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多项目经理和团队在管理复杂项目时,常...
开源项目管理工具   96  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Smartsheet、GanttPRO、Backlog、Visor、ResourceGuru、Productive、Xebrio、Hive、Quire。在当今快节奏的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在选择项目管理工具时常常面临困惑:...
项目管理系统   83  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用