2015-12-05 4 views
5

Я уверен, что есть способ сделать это, но я не смог его найти. Скажем, у меня есть:Распаковать вложенный список аргументов 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) для первой итерации
  • Trying 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]