具有 2 个输入的 python 3 map/lambda 方法
Posted
技术标签:
【中文标题】具有 2 个输入的 python 3 map/lambda 方法【英文标题】:python 3 map/lambda method with 2 inputs 【发布时间】:2014-12-20 00:31:28 【问题描述】:我在 python 3 中有如下字典:
ss = 'a':'2', 'b','3'
我想使用 map
函数将他的所有值转换为 int,我写了这样的东西:
list(map(lambda key,val: int(val), ss.items())))
但蟒蛇抱怨:
TypeError: () 缺少 1 个必需的位置参数:'val'
我的问题是如何编写带有两个输入(例如 key 和 val)的 lambda
函数
【问题讨论】:
你用两个参数编写它就好了,但问题是它只被一个参数调用,一个元组(key, val)
。
如果你不想对键做任何事情,为什么不直接映射到ss.values()
?
您需要使用itertools.starmap
而不是普通的map
,因为它会为我们解包参数(但前提是您同时使用键和值,否则正如 BrenBarn 指出的那样,这是不必要的)。在 Python 2 中,可以使用简单的元组参数解包:lambda (key, val): int(val)
。
您是否考虑过字典理解:k: int(v) for k, v in ss.items()
或者如果您想就地修改字典:for k, v in ss.items(): ss[k] = int(v)
如果您只需要值,那么:values = map(int, ss.values())
【参考方案1】:
ss.items()
会给出一个可迭代对象,它会在每次迭代时给出元组。在您的 lambda
函数中,您已将其定义为接受两个参数,但元组将被视为单个参数。所以没有值要传递给第二个参数。
你可以这样修复它
print(list(map(lambda args: int(args[1]), ss.items())))
# [3, 2]
如果您仍然忽略密钥,只需像这样使用ss.values()
print(list(map(int, ss.values())))
# [3, 2]
否则,as suggested by Ashwini Chaudhary,使用itertools.starmap
,
from itertools import starmap
print(list(starmap(lambda key, value: int(value), ss.items())))
# [3, 2]
我更喜欢列表理解方式
print([int(value) for value in ss.values()])
# [3, 2]
在 Python 2.x 中,您可以这样做
print map(lambda (key, value): int(value), ss.items())
此功能称为元组参数解包。但是这在 Python 3.x 中被删除了。在PEP-3113了解更多信息
【讨论】:
您还有什么其他想提及的方式吗? :p 选项零是调用ss.values()
:result = map(int, ss.values())
感谢您的全面回复。还要感谢 Ashwini 的星图。我不知道 python 2 和 3 的区别。这是我的主要问题。以上是关于具有 2 个输入的 python 3 map/lambda 方法的主要内容,如果未能解决你的问题,请参考以下文章