Usando una función con múltiples parámetros con `map`

Estoy tratando de asignar una función que lleva 2 argumentos a una lista:

my_func = lambda index, value: value.upper() if index % 2 else value.lower() import string alphabet = string.ascii_lowercase n = map(my_func, enumerate(alphabet)) for element in n: print(element) 

Esto me da un TypeError: () missing 1 required positional argument: 'value' .

¿Cuál es la forma correcta de asignar mi lambda en esta entrada?

Python no puede descomprimir los parámetros lambda automáticamente. enumerate devuelve una tuple , por lo que lambda tiene que tomar esa tupla como único argumento

Necesitas:

 n = map(lambda t: t[1].upper() if t[0] % 2 else t[1], enumerate(alphabet)) 

Teniendo en cuenta ahora la fealdad del map + lambda + desempaquetado manual, recomendaría la comprensión del generador alternativo en su lugar:

 n = (value.upper() if index % 2 else value for index,value in enumerate(alphabet)) 

(Eliminé la llamada lower() ya que su entrada ya está en minúsculas)

map pasará cada valor de enumerate como un único parámetro a la callback, es decir, se llamará a lambda con una tupla como argumento. Sería un comportamiento bastante sorprendente si el map desempaquetara los argumentos que parecen desempaquetados, ya que entonces su comportamiento dependería de los valores sobre los que itera.

Para expandir los argumentos iterables, use starmap en starmap lugar, que “aplica un * (estrella)” al pasar los argumentos:

 from itertools import starmap n = starmap(lambda index, value: ..., enumerate(alphabet)) 

Python no puede descomprimir los parámetros lambda automáticamente.

Pero puede solucionar esto pasando un argumento de range adicional al map :

 import string alphabet = string.ascii_lowercase n = map(lambda i, v: v.upper() if i % 2 else v.lower(), range(len(alphabet)), alphabet) for element in n: print(element) 

Según los documentos :

mapa ( función , iterable , …)

Devuelva un iterador que aplique la función a cada elemento de iterable, dando los resultados. Si se pasan argumentos iterables adicionales, la función debe tomar tantos argumentos y se aplica a los elementos de todos los iterables en paralelo. Con múltiples iterables, el iterador se detiene cuando se agota el iterable más corto. Para los casos en que las entradas de funciones ya están organizadas en tuplas de argumentos, consulte itertools.starmap ().