Unpack nested list for arguments to map()

半世苍凉 提交于 2019-12-01 17:54:22

问题


I'm sure there's a way of doing this, but I haven't been able to find it. Say I have:

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

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

Then how can I use map(add, foo) such that it passes num1=1, num2=2 for the first iteration, i.e., it does add(1, 2), then add(3, 4) for the second, etc.?

  • Trying map(add, foo) obviously does add([1, 2], #nothing) for the first iteration
  • Trying map(add, *foo) does add(1, 3, 5) for the first iteration

I want something like map(add, foo) to do add(1, 2) on the first iteration.

Expected output: [3, 7, 11]


回答1:


It sounds like you need starmap:

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

This unpacks each argument [a, b] from the list foo for you, passing them to the function add. As with all the tools in the itertools module, it returns an iterator which you can consume with the list built-in function.

From the documents:

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).




回答2:


try this:

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

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

print(map(lambda x: add(x[0], x[1]), foo))



回答3:


There was another answer with a perfectly valid method (even if not as readable as ajcr's answer), but for some reason it was deleted. I'm going to reproduce it, as it may be useful for certain situations

>>> map(add, *zip(*foo))
[3, 7, 11]


来源:https://stackoverflow.com/questions/34110317/unpack-nested-list-for-arguments-to-map

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!