具有 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 方法的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 546. 移除盒子 | Python

具有多个可能输入的类型检查 Python 方法

Python:计算具有不同长度的列表列表中第 n 个元素的平均值

python之hashlib模块

具有 3 个结果的支持向量机 [关闭]

神经网络中“节点”与“输入”之间的差异