2011-10-04 14 views
5

¿Cuál sería una forma elegante de map un parámetro lambda función para una lista de valores donde el primer parámetro es constante y el segundo se toma de un list?mapa lambda x, y con una constante x

Ejemplo:

lambda x,y: x+y 
x='a' 
y=['2','4','8','16'] 

resultado esperado:

['a2','a4','a8','a16'] 

Notas:

  • Esto es sólo un ejemplo, la función lambda real es más complicada
  • Suponga yo no puede utilizar la lista de comprensión

Respuesta

15

Puede utilizar itertools.starmap

a = itertools.starmap(lambda x,y: x+y, zip(itertools.repeat(x), y)) 
a = list(a) 

y se obtiene el resultado que desea.

Por cierto, tanto itertools.imap y de map python3 aceptará lo siguiente:

itertools.imap(lambda x,y: x+y, itertools.repeat(x), y) 

El valor por defecto de python2 map no se detendrá al final de y e insertará None s ...


Pero una comprensión es mucho mejor

[x + num for num in y] 
+1

+1 por sugerir la comprensión de la lista pythonic en lugar de esa función bruta del mapa ol (= - aunque acabo de notar que el asker dice "asume que no puedo usar la comprensión de la lista" –

10

Python 2.x

from itertools import repeat 

map(lambda (x, y): x + y, zip(repeat(x), y)) 

Python 3.x

map(lambda xy: ''.join(xy), zip(repeat(x), y)) 
+0

Sólo tenga en cuenta que no funcionará Python 3 ... – JBernardo

+0

@JBernardo, ¿se llevaron 'desempacando en la firma'? Me parece recordar algo así. –

+0

Sí, es por eso que sugerí 'starmap' en mi respuesta. – JBernardo

5
def prependConstant(x, y): 
    return map(lambda yel: x + yel, y) 
9

También se puede usar para este cierre

x='a' 
f = lambda y: x+y 
map(f, ['1', '2', '3', '4', '5']) 
>>> ['a1', 'a2', 'a3', 'a4', 'a5'] 
4
['a' + x for x in y] 

o si realmente necesita un exigible:

def f(x, y): 
    return x + y 

[f('a', x) for x in y] 
2

¿Tiene que usar lambda?

>>> x='a' 
>>> y=['2','4','8','16'] 
>>> map(x.__add__, y) 
['a2', 'a4', 'a8', 'a16'] 
>>> 
-1

BTW, tanto itertools.imap y mapa de python3 aceptará los siguientes:

itertools.imap (lambda x, y: x + y, itertools.repeat (x), y) El mapa predeterminado de Python2 no se detendrá al final de y e insertará Nones ...

Sólo quería añadir a esta respuesta de que en Python 2.x se puede hacer algo como

map(lambda x,y: x+y, itertools.repeat(x, len(y))) 

para obtener itertools para detener la iteración.

Cuestiones relacionadas