2011-10-04 22 views
5

Quale sarebbe un modo elegante per map una funzione a due parametri lambda per un elenco di valori in cui il primo parametro è costante e il secondo è preso da un list?map lambda x, y con una costante x

Esempio:

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

risultato atteso:

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

Note:

  • Questo è solo un esempio, la funzione lambda reale è più complicato
  • Assumere io non può usare di lista

risposta

15

È possibile utilizzare itertools.starmap

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

e si ottiene l'output desiderato.

BTW, sia itertools.imap e di map python3 accetterà la seguente:

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

Il valore di default del python2 map non si fermerà alla fine del y e inserirà None s ...


Ma una comprensione è molto meglio

[x + num for num in y] 
+1

+1 per suggerire la comprensione di elenchi pitonici invece di quella funzione di mappa ol grossolana (= - anche se ho appena notato che gli stati dei richiedenti "presumo che non sia possibile usare la comprensione di 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

Basta essere consapevoli che non funzionerà Python 3 ... – JBernardo

+0

@JBernardo, hanno tolto 'disimballaggio in firma' via? Mi sembra di ricordare qualcosa del genere –

+0

Sì, è per questo che ho suggerito 'starmap' sulla mia risposta. – JBernardo

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

Inoltre è possibile utilizzare la chiusura di questo

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 se si ha realmente bisogno di un callable:

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

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

Avete usare lambda?

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

BTW, sia itertools.imap e mappa di python3 accetteranno il seguente:

itertools.imap (lambda x, y: x + y, itertools.repeat (x), y) La mappa predefinita di Python2 non si fermerà alla fine di y e inserirà Nones ...

Volevo solo aggiungere a questa risposta che in Python 2.x si può fare qualcosa di simile

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

per arrivare itertools per fermare l'iterazione.

Problemi correlati