压缩对象上的python map()

时间:2016-12-01 13:36:00

标签: python python-3.x dictionary zip

我有两个输入列表ab以及一个带两个输入的函数,比方说

def f(x, y): return x*y

如何使用map()进行此设置?我试过了

map(f, zip(a,b))

得到了

  

TypeError:f()只需要2个参数(给定1个)

这很有意义,因为我需要解压缩压缩输入。我怎么能这样做?

2 个答案:

答案 0 :(得分:9)

map并不将迭代器解包为函数参数,而是作为处理此类问题的更通用方法,您可以使用itertools模块中的starmap()函数。当参数参数已经从一个可迭代的元组中分组时,应该使用map()而不是from itertools import starmap starmap(f, zip(a,b))

In [2]: a = range(5)

In [3]: b = range(5, 10)

In [7]: from itertools import starmap

In [8]: list(starmap(f, zip(a,b)))
Out[8]: [0, 6, 14, 24, 36]

以下是一个例子:

In [13]: list(map(mul, a, b))
Out[13]: [0, 6, 14, 24, 36]

作为另一种选择,你可以将迭代物分别传递给它而不用压缩它们。

operator.mul()

另外,作为两个变量相乘的更加pythonic的方法,您可以使用In [9]: from operator import mul In [10]: list(starmap(mul, zip(a,b))) Out[10]: [0, 6, 14, 24, 36] 而不是创建自定义函数:

In [11]: %timeit list(starmap(mul, zip(a,b)))
1000000 loops, best of 3: 838 ns per loop

In [12]: %timeit list(starmap(f, zip(a,b)))
1000000 loops, best of 3: 1.05 µs per loop

以下是基准:

Slick.definePseudo('in-fold', function(){
    var isInFold = false;
    // code to determine if the element is visible in the viewport
    return isInFold;
});

答案 1 :(得分:0)

您可以使用 lambda 函数来处理以下情况:

Map(lambda (x,z): function(x,z), zip(listA, listB))

我知道这是一篇旧文章,但将来可能会对其他人有所帮助。

PD:对不起,我打来的电话打错了。