【问题标题】:python map() on zipped object压缩对象上的python map()
【发布时间】:2017-04-16 04:14:22
【问题描述】:

我有两个输入列表 a 和 b 以及一个需要两个输入的函数,比如说

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

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

map(f, zip(a,b))

得到了

TypeError: f() 只接受 2 个参数(给定 1 个)

这是有道理的,因为我需要解压缩压缩输入。我该怎么做?

【问题讨论】:

  • map(f, a, b).
  • def f(x): return x[0]*x[1]

标签: python python-3.x dictionary zip


【解决方案1】:

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]

另外,作为一种更 Pythonic 的方式来将两个变量相乘,您可以使用 operator.mul() 而不是创建自定义函数:

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

【讨论】:

    【解决方案2】:

    您可以使用 lambda 函数来处理这种情况,其中:

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

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

    PD:抱歉,我的手机打错字了。

    【讨论】:

    • python 3 不支持元组参数解包。
    猜你喜欢
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    • 2017-03-30
    • 2011-03-25
    • 2019-11-17
    相关资源
    最近更新 更多