Как это происходит, map
принимает * арг, поэтому ваш первоначальный вызов map(foo, *x)
не сразу неудачи - но то, что происходит в том, что каждый элемент от x
рассматривается как последовательность значений для одного аргумента до foo
- поэтому он пытается выполнить foo(1, 3, 5)
и затем попытается выполнить foo(2, 4, 6)
, за исключением того, что foo
принимает только 2 аргумента.
Поскольку мы можем видеть, что наш вклад x
фактически является «транспонированная матрица», что мы хотели бы питаться в, что прямо указывает нам на обходной путь:
>>> list(map(foo, *zip(*x))) # list() wrapping for 3.x support
[3, 13, 31]
... Но не сделай это. Использовать itertools.starmap
; он построен для этого и значительно более четко о ваших намерениях.