5

我敢肯定有办法做到这一点,但我一直无法找到它。说我有:

foo = [
    [1, 2],
    [3, 4],
    [5, 6]
]

def add(num1, num2):
    return num1 + num2

那么我如何使用map(add, foo)它使其通过num1=1num2=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]

4

3 回答 3

8

听起来你需要starmap

>>> import itertools
>>> list(itertools.starmap(add, foo))
[3, 7, 11]

[a, b]这会为您解压缩列表中的每个参数foo,并将它们传递给函数add。与itertools模块中的所有工具一样,它返回一个迭代器,您可以使用list内置函数使用该迭代器。

从文件:

map()当参数参数已经从单个可迭代的元组中分组(数据已“预压缩”)时使用而不是使用。和 之间的区别map()与和之间starmap()的区别相似。function(a,b)function(*c)

于 2015-12-05T20:13:45.797 回答
1

试试这个:

 foo = [
    [1, 2],
    [3, 4],
    [5, 6]]

def add(num1, num2):
        return num1 + num2

print(map(lambda x: add(x[0], x[1]), foo))
于 2015-12-05T20:16:29.170 回答
1

还有另一个答案是完全有效的方法(即使不像ajcr的答案那样可读),但由于某种原因它被删除了。我将重现它,因为它可能对某些情况有用

>>> map(add, *zip(*foo))
[3, 7, 11]
于 2015-12-07T11:50:39.320 回答