Digamos que tenemos una función agregar de la siguiente manera
def add(x, y):
return x + y
queremos aplicar la función de mapa para una matriz
map(add, [1, 2, 3], 2)
La semántica es que quiero agregar 2 a cada elemento de la matriz. Pero la map
función también requiere una lista en el tercer argumento.
Nota: Estoy poniendo el ejemplo de agregar por simplicidad. Mi función original es mucho más complicada. Y, por supuesto, la opción de configurar el valor predeterminado de la y
función in add está fuera de discusión, ya que se cambiará para cada llamada.
map(add,[1,2,3],[2]*3)
en generalmap
toma una función como su primer argumento, y si esta función toma un argumento K , debe seguir con K iterable:addTriple(a,b,c) -> map(addTriple,[...],[...],[...])
Respuestas:
Una opción es una lista de comprensión:
Mas opciones:
fuente
add()
es una función no trivialmap()
no ayudará de ninguna manera.map()
comporta comozip_longest()
en Python 2, mientras que se comporta comozip()
en Python 3.)Los documentos sugieren explícitamente que este es el uso principal para
itertools.repeat
:Y no hay razón para pasar
len([1,2,3])
comotimes
argumento;map
se detiene tan pronto como se consume el primer iterable, por lo que un iterable infinito está perfectamente bien:De hecho, esto es equivalente al ejemplo de
repeat
en los documentos:Esto lo convierte en una buena solución de lenguaje perezoso y funcional que también es perfectamente legible en términos de iterador de Python.
fuente
def f(x,y,z): \\ return '.'.join([x,y,z])
y luego:list(map(f, list('abc'), repeat('foo'), list('defgh')))
regresa['a.foo.d', 'b.foo.e', 'c.foo.f']
.repeat()
, ya quemap()
se ejecutará hasta que se agote el iterador más largo en esa versión de Python, completandoNone
todos los valores faltantes. Decir que "no hay razón" para pasar el parámetro está mal.Usa una lista de comprensión.
Si realmente , realmente , realmente quiere usar
map
, dele una función anónima como primer argumento:fuente
El mapa puede contener múltiples argumentos, la forma estándar es
En su pregunta, debería ser
fuente
La respuesta correcta es más simple de lo que piensas. Simplemente haz:
Y cambie la implementación de add para tomar una tupla, es decir
Esto puede manejar cualquier caso de uso complicado donde ambos parámetros de adición son dinámicos.
fuente
Algunas veces resolví situaciones similares (como usar el método pandas.apply ) usando cierres
Para usarlos, usted define una función que define y devuelve dinámicamente un contenedor para su función, convirtiendo efectivamente uno de los parámetros en una constante.
Algo como esto:
Luego,
add_constant(y)
devuelve una función que se puede usar para agregary
a cualquier valor dado:Lo que le permite usarlo en cualquier situación en la que los parámetros se dan uno a la vez:
editar
Si no desea tener que escribir la función de cierre en otro lugar, siempre tiene la posibilidad de construirla sobre la marcha utilizando una función lambda:
fuente
Si lo tiene disponible, consideraría usar numpy. Es muy rápido para este tipo de operaciones:
Esto supone que su aplicación real está haciendo operaciones matemáticas (que se pueden vectorizar).
fuente
Si realmente necesita usar la función de mapa (como mi asignación de clase aquí ...), podría usar una función de contenedor con 1 argumento, pasando el resto a la original en su cuerpo; es decir:
Sucio y feo, todavía funciona
fuente
myFunc
necesitareturn Func(arg, extraArguments)
Func
es el nombre de su función original; para OP tight sería,add
por ejemploCreo que Starmap es lo que necesitas:
fuente
Para pasar múltiples argumentos a una
map
función.Aquí q es una función con múltiples argumentos que map () llama. Asegúrese de que la longitud de ambos rangos es decir
fuente
En:
nums = [1, 2, 3]
En:
map(add, nums, [2]*len(nums))
Fuera:
[3, 4, 5]
fuente
Puede incluir lambda junto con el mapa:
fuente
Al ajustar la llamada a la función con una lambda y usar el descomprimir estrella, puede hacer un mapa con un número arbitrario de argumentos.
fuente
Otra opción es:
Este formato es muy útil cuando se llaman múltiples funciones.
fuente