Python 在使用map()时使用*idiom解压参数

Python 在使用map()时使用*idiom解压参数,python,map,iterable-unpacking,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) 其中结果等于您要查找的itertools.starmap: def foo(a, b): return a**2 + b x = [(1,2), (3,4), (5,6)] from itertools import sta

在使用Python内置的
map
时,是否有方法使用
*
习惯用法解压元组

理想情况下,我想做以下工作:

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

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

results = map(foo, *x)

其中结果等于您要查找的
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]
def foo(a,b):
返回a**2+b
x=[(1,2)、(3,4)、(5,6)]
从itertools导入星图
星图(foo,x)
出[3]:
列表(星图(foo,x))
出[4]:[3,13,31]

请注意,即使在Python2中,
starmap
也会返回一个iterable,您必须使用类似于
list
的方式手动使用它,这比@roippi的方式更丑陋

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

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

碰巧,
map
接受*args,所以您最初的调用
map(foo,*x)
不会立即失败-但是发生的是
x
中的每个元素都被视为一个
foo
参数的值序列-因此它尝试
foo(1,3,5)
,然后尝试
foo(2,4,6)
当然,除了
foo
只接受2个参数

因为我们可以看到,我们的输入
x
实际上是我们想要输入的内容的“矩阵转置”,这直接指向了一个解决方法:

>>> list(map(foo, *zip(*x))) # list() wrapping for 3.x support
[3, 13, 31]
。。。但不要那样做。使用
itertools.starmap
;它就是为这个而建立的,并且非常清楚你的意图