映射Lambda函数 x、y,并使用常量x。

5

如何优雅地将一个带有两个参数的lambda函数映射到值列表,其中第一个参数是常量,第二个参数来自列表?

示例:

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

期望结果:

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

注意:

  • 这只是一个例子,实际的lambda函数更加复杂
  • 假设我不能使用列表推导式
7个回答

18
你可以使用 itertools.starmap
a = itertools.starmap(lambda x,y: x+y, zip(itertools.repeat(x), y))
a = list(a)

然后您就会得到所需的输出。

顺便提一下,无论是 itertools.imap 还是 Python3 的 map 都将接受以下内容:

itertools.imap(lambda x,y: x+y, itertools.repeat(x), y)
默认的Python2中的map函数不会在结束y后停止,并且会插入None。但是,使用推导式会更好。
[x + num for num in y]

1
建议使用Pythonic列表推导式,而不是那个过时的map函数。尽管我刚注意到提问者说“假设我不能使用列表推导式”。 - Cody Hess

11

你也可以使用闭包来实现这个功能。

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

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))

@JBernardo,他们取消了“签名中的解包”吗?我记得有类似的事情。 - Adam Wagner
是的,这就是为什么我在我的回答中建议使用starmap的原因。 - JBernardo

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

5
['a' + x for x in y]

或者如果你真的需要一个可调用对象:

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

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

2

您是否必须使用lambda表达式?

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

1

顺便提一下,itertools.imap和Python3的map都可以接受以下方式:

itertools.imap(lambda x,y: x+y, itertools.repeat(x), y) 默认的Python2的map将不会在y的结尾处停止,并会插入None值...

我想补充一下,在Python 2.x中,你可以这样做:

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

让itertools停止迭代。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接