2024-04-26 11:16:40 发布
网友
在使用Python内置的map时,有没有办法用*习惯用法解压元组?你知道吗
map
*
理想情况下,我想做以下工作:
def foo(a, b): return a**2 + b x = [(1,2), (3,4), (5,6)] results = map(foo, *x)
结果等于[3, 13, 31]
[3, 13, 31]
一种比@roippi的方式更丑陋的方式。。。你知道吗
x = [(1,2), (3,4), (5,6)] map(lambda y:y[0]**2 + y[1], x)
你在找itertools.starmap:
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的东西手动使用它。你知道吗
starmap
list
恰巧,map接受*args,所以您最初的调用map(foo, *x)不会立即失败-但是,来自x的每个元素都被视为foo的一个参数的值序列-所以它尝试foo(1, 3, 5),然后尝试foo(2, 4, 6),当然foo只接受2个参数。你知道吗
map(foo, *x)
x
foo
foo(1, 3, 5)
foo(2, 4, 6)
因为我们可以看到,我们的输入x实际上是我们想要输入的内容的“矩阵转置”,这直接将我们指向一个解决方法:
>>> list(map(foo, *zip(*x))) # list() wrapping for 3.x support [3, 13, 31]
。。。但别那么做。使用itertools.starmap;它是为此而构建的,并且非常清楚您的意图。你知道吗
一种比@roippi的方式更丑陋的方式。。。你知道吗
你在找
itertools.starmap
:请注意,即使在python2中,
starmap
也会返回一个iterable,您必须使用类似list
的东西手动使用它。你知道吗恰巧,
map
接受*args,所以您最初的调用map(foo, *x)
不会立即失败-但是,来自x
的每个元素都被视为foo
的一个参数的值序列-所以它尝试foo(1, 3, 5)
,然后尝试foo(2, 4, 6)
,当然foo
只接受2个参数。你知道吗因为我们可以看到,我们的输入
x
实际上是我们想要输入的内容的“矩阵转置”,这直接将我们指向一个解决方法:。。。但别那么做。使用
itertools.starmap
;它是为此而构建的,并且非常清楚您的意图。你知道吗相关问题 更多 >
编程相关推荐