使用map()时使用* idiom解包参数

时间:2014-09-26 02:11:51

标签: python map iterable-unpacking

在Python中使用*内置函数时,有没有办法用map成语解包元组?

理想情况下,我想做以下事情:

def foo(a, b):
  return a**2 + b

x = [(1,2), (3,4), (5,6)]

results = map(foo, *x)

结果等于[3, 13, 31]

3 个答案:

答案 0 :(得分:6)

您正在寻找itertools.starmap

def foo(a, b):
  return a**2 + b

x = [(1,2), (3,4), (5,6)]

from itertools import starmap

starmap(foo, x)
Out[3]: <itertools.starmap at 0x7f40a8c99310>

list(starmap(foo, x))
Out[4]: [3, 13, 31]

请注意,即使在python 2中,starmap也会返回一个必须手动使用list之类的迭代。

答案 1 :(得分:1)

比@ roippi的方式更丑陋...

x = [(1,2), (3,4), (5,6)]

map(lambda y:y[0]**2 + y[1], x)

答案 2 :(得分:1)

碰巧,map接受* args,因此原始调用map(foo, *x) }被视为x的一个参数的值序列 - 因此它会尝试foo然后尝试foo(1, 3, 5),当然foo(2, 4, 6)只接受2个参数。< / p>

由于我们可以看到我们的输入foo实际上是我们想要提供的“矩阵转置”,这直接指出了我们的解决方法:

x

......但不要这样做。使用>>> list(map(foo, *zip(*x))) # list() wrapping for 3.x support [3, 13, 31] ;它是为此而构建的,并且相当清楚你的意图。