解压 map() 参数的嵌套列表
Unpack nested list for arguments to map()
我确定有办法做到这一点,但我一直找不到。假设我有:
foo = [
[1, 2],
[3, 4],
[5, 6]
]
def add(num1, num2):
return num1 + num2
那么我如何使用 map(add, foo)
使其在第一次迭代中通过 num1=1
、num2=2
,即它会 add(1, 2)
,然后 add(3, 4)
第二个等等?
- 第一次迭代
map(add, foo)
显然 add([1, 2], #nothing)
- 第一次迭代尝试
map(add, *foo)
add(1, 3, 5)
我想要 map(add, foo)
之类的东西在第一次迭代时执行 add(1, 2)
。
预期输出:[3, 7, 11]
听起来你需要starmap
:
>>> import itertools
>>> list(itertools.starmap(add, foo))
[3, 7, 11]
这会为您解压列表 foo
中的每个参数 [a, b]
,并将它们传递给函数 add
。与 itertools
模块中的所有工具一样,它 returns 是一个可以使用 list
内置函数使用的迭代器。
来自文档:
Used instead of map()
when argument parameters are already grouped in tuples from a single iterable (the data has been “pre-zipped”). The difference between map()
and starmap()
parallels the distinction between function(a,b)
and function(*c)
.
试试这个:
foo = [
[1, 2],
[3, 4],
[5, 6]]
def add(num1, num2):
return num1 + num2
print(map(lambda x: add(x[0], x[1]), foo))
还有一个完全有效方法的答案(即使不如 ajcr 的答案可读),但由于某种原因它被删除了。我将重现它,因为它可能对某些情况有用
>>> map(add, *zip(*foo))
[3, 7, 11]
我确定有办法做到这一点,但我一直找不到。假设我有:
foo = [
[1, 2],
[3, 4],
[5, 6]
]
def add(num1, num2):
return num1 + num2
那么我如何使用 map(add, foo)
使其在第一次迭代中通过 num1=1
、num2=2
,即它会 add(1, 2)
,然后 add(3, 4)
第二个等等?
- 第一次迭代
map(add, foo)
显然add([1, 2], #nothing)
- 第一次迭代尝试
map(add, *foo)
add(1, 3, 5)
我想要 map(add, foo)
之类的东西在第一次迭代时执行 add(1, 2)
。
预期输出:[3, 7, 11]
听起来你需要starmap
:
>>> import itertools
>>> list(itertools.starmap(add, foo))
[3, 7, 11]
这会为您解压列表 foo
中的每个参数 [a, b]
,并将它们传递给函数 add
。与 itertools
模块中的所有工具一样,它 returns 是一个可以使用 list
内置函数使用的迭代器。
来自文档:
Used instead of
map()
when argument parameters are already grouped in tuples from a single iterable (the data has been “pre-zipped”). The difference betweenmap()
andstarmap()
parallels the distinction betweenfunction(a,b)
andfunction(*c)
.
试试这个:
foo = [
[1, 2],
[3, 4],
[5, 6]]
def add(num1, num2):
return num1 + num2
print(map(lambda x: add(x[0], x[1]), foo))
还有一个完全有效方法的答案(即使不如 ajcr 的答案可读),但由于某种原因它被删除了。我将重现它,因为它可能对某些情况有用
>>> map(add, *zip(*foo))
[3, 7, 11]