argumentos lambda desempaquetan error

En Python 2 este código está bien:

f = lambda (m, k): m + k m = [1,2,3,4] k = [5,6,7,8] print(map(f, zip(m, k))) 

pero en Python 3 ocurrió el siguiente error:

 f = lambda (m, k): m + k ^ SyntaxError: invalid syntax 

Si elimino paréntesis en la expresión lambda, se produjo otro error:

 TypeError: () missing 1 required positional argument: 'k' 

También el enfoque con tupla como único argumento lambda funciona en Python 3, pero no está claro (difícil de leer):

 f = lambda args: args[0] + args[1] 

¿Cómo puedo descomprimir los valores de la manera correcta en Python 3?

La eliminación del desempaquetado de la tupla se describe en PEP 3113 . Básicamente, no puedes hacer esto en Python 3. Bajo el titular del plan de transición , verás que la forma “sugerida” de hacer esto es como tu bloque de código final:

 lambda x_y: x_y[0] + x_y[1] 

Puede usar la misma syntax tanto en Python 2 como en Python 3 si usa itertools.starmap lugar del map que desempaqueta los elementos de la tupla para nosotros:

 >>> from itertools import starmap >>> f = lambda m, k: m + k >>> list(starmap(f, zip(m, k))) [6, 8, 10, 12] 

No puede usar paréntesis en Python3 para desempaquetar argumentos en funciones lambda ( PEP 3113 ), intente:

 f = lambda m, k: m + k 

Para que funcione con tu código, debes usar:

 lambda mk: mk[0] + mk[1] 

Puede encontrar esta solución más fácil de leer:

 lambda mk: (lambda m,k: m + k)(*mk) 

Además, diría que el desempaquetado hace que esto sea más (1) Pythonic y (2) coherente con el desempaque manual de los argumentos de la tupla para funciones nombradas , requerido en Python 3 por PEP 3113 .

O simplemente puede sumr () para agregar números sin descomprimir:

 f = lambda args: sum(args) 

Solo usa

 map(f, m, k) 

Tenga en cuenta que f puede ser

 from operator import add map(add, m, k)