【发布时间】:2011-10-04 12:21:43
【问题描述】:
将map 两个参数lambda 函数转换为第一个参数为常量而第二个参数取自list 的值列表的优雅方法是什么?
示例:
lambda x,y: x+y
x='a'
y=['2','4','8','16']
预期结果:
['a2','a4','a8','a16']
注意事项:
- 这只是一个例子,实际的lambda函数更复杂
- 假设我不能使用列表理解
【问题讨论】:
将map 两个参数lambda 函数转换为第一个参数为常量而第二个参数取自list 的值列表的优雅方法是什么?
示例:
lambda x,y: x+y
x='a'
y=['2','4','8','16']
预期结果:
['a2','a4','a8','a16']
注意事项:
【问题讨论】:
您可以使用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的末尾,会插入Nones...
但是理解要好很多
[x + num for num in y]
【讨论】:
你也可以为此使用闭包
x='a'
f = lambda y: x+y
map(f, ['1', '2', '3', '4', '5'])
>>> ['a1', 'a2', 'a3', 'a4', 'a5']
【讨论】:
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))
【讨论】:
starmap。
def prependConstant(x, y):
return map(lambda yel: x + yel, y)
【讨论】:
['a' + x for x in y]
或者如果你真的需要一个可调用对象:
def f(x, y):
return x + y
[f('a', x) for x in y]
【讨论】:
你必须使用 lambda 吗?
>>> x='a'
>>> y=['2','4','8','16']
>>> map(x.__add__, y)
['a2', 'a4', 'a8', 'a16']
>>>
【讨论】:
顺便说一句,itertools.imap 和 Python3 的地图都将接受以下内容:
itertools.imap(lambda x,y: x+y, itertools.repeat(x), y) 默认 Python2 的 map 不会停在 y 的末尾,会插入 Nones...
我只是想补充一下这个答案,在 python 2.x 中你可以做类似的事情
map(lambda x,y: x+y, itertools.repeat(x, len(y)))
让 itertools 停止迭代。
【讨论】: