2015-12-05 45 views
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]

+1

有用的,什麼你說你要爲預期的輸出是不一樣的 –

回答

7

這聽起來像你需要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)之間的區別相似。

+1

哇,好知道它。 :) –

+0

再次閱讀問題後,似乎我們都錯了,因爲OP想要'加(1,2'),然後'加(2,3)'......除非這是OP –

+0

的錯誤' [3,7,11]'確實是我的例子的預期結果:) – binaryfunt

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)) 
+0

這可能比ajcr的答案稍快 – binaryfunt

0

有一個完全有效的方法(即使沒有可讀性ajcr的答案),但由於某種原因已被刪除另一個答案。我要去複製它,因爲它可能是你可以檢查你的問題的答案對某些情況下

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