如何使用map计算具有多个参数的函数

时间:2017-04-14 04:59:32

标签: python python-3.x mapreduce

.i有一个分类器功能:

def f(x, threshold):
if logi == 1:
    if x > threshold:
        return 1
    else:
        return 0

并且有一个列表a = [2,3,12,4,53,3],如果使用map(f(threshold = 4),a)将引发错误" f()缺少1需要位置论证:' x'" 但如果我指定阈值默认值4,它将起作用。将函数定义修改为

def f(x, threshold=4):
if logi == 1:
    if x > threshold:
        return 1
    else:
        return 0
map(f,a)

会有预期的结果[0,0,1,0,1,0],我想知道是否有一些方法可以达到相同的目标而不指定参数默认值?

2 个答案:

答案 0 :(得分:0)

  

我想知道是否有某种方法可以达到同一目标   没有指定参数默认值?提前谢谢!

肯定有!,真的有几种方法。 我个人使用列表理解,因为它们是如此可读。像这样:

def f(x, threshold, logi=1):
    if logi == 1:
        if x > threshold:
            return 1
        else:
            return 0
    else:
        if x < threshold:
            return 1
        else:
            return 0

a=[2, 3, 12, 4, 53, 3]

x = [f(item, 4) for item in a]
print(x)
#output =>  [0, 0, 1, 0, 1, 0]

希望这会有所帮助:)

如果你在地图上设置,那么functools可能会有所帮助:

from functools import partial
mapfunc = partial(f, 4)
(map(mapfunc, a))

答案 1 :(得分:0)

map支持接受多个iterables,在最短时间结束时停止,将每个的输出作为顺序postional参数传递给mapper函数。如果你有一个固定的参数,你可以使用itertools.repeat反复产生它,例如:

from itertools import repeat

map(f, a, repeat(4))

这种方法可以推广到更复杂的场景,允许循环使用一组固定的值(itertools.cycle),或者只使用zip配对两个迭代,但不需要zip然后itertools.starmap元组回到位置参数。

另一种对常量参数特别有用的方法是与functools.partial部分绑定:

from functools import partial
map(partial(f, threshold=4), a)

其中partial创建一个新的(CPython中的C级)包装器函数,该函数在未显式覆盖时将提供的参数传递给包装函数。