在Python中使用*
内置函数时,有没有办法用map
成语解包元组?
理想情况下,我想做以下事情:
def foo(a, b):
return a**2 + b
x = [(1,2), (3,4), (5,6)]
results = map(foo, *x)
结果等于[3, 13, 31]
答案 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]
;它是为此而构建的,并且相当清楚你的意图。