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

2024-04-26 11:16:40 发布

您现在位置:Python中文网/ 问答频道 /正文

在使用Python内置的map时,有没有办法用*习惯用法解压元组?你知道吗

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

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

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

results = map(foo, *x)

结果等于[3, 13, 31]


Tags: mapreturnfoodef情况results内置元组
3条回答

一种比@roippi的方式更丑陋的方式。。。你知道吗

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

map(lambda y:y[0]**2 + y[1], 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]

请注意,即使在python2中,starmap也会返回一个iterable,您必须使用类似list的东西手动使用它。你知道吗

恰巧,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;它是为此而构建的,并且非常清楚您的意图。你知道吗

相关问题 更多 >