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)