python - 如何忽略元组的解压缩部分作为 lambda 的参数?

标签 python lambda tuples iterable-unpacking argument-unpacking

在 Python 中,按照惯例,下划线 (_) 通常用于丢弃未打包的元组的部分内容,如下所示

>>> tup = (1,2,3)
>>> meaningfulVariableName,_,_ = tup
>>> meaningfulVariableName
1

我正在尝试对 lambda 的元组参数执行相同的操作。这似乎不公平,它只能用 2 元组来完成......

>>> map(lambda (meaningfulVariableName,_): meaningfulVariableName*2, [(1,10), (2,20), (3,30)]) # This is fine
[2, 4, 6]

>>> map(lambda (meaningfulVariableName,_,_): meaningfulVariableName*2, [(1,10,100), (2,20,200), (3,30,300)]) # But I need this!
SyntaxError: duplicate argument '_' in function definition (<pyshell#24>, line 1)

有什么想法吗?实现这一目标的最佳方法是什么?

最佳答案

如评论中所述,只需使用 stared arguments 在“_”中抛出剩余参数:

lambda x, *_: x*2 

如果您在 map 语句中使用这些,因为 Python 不会将元组中的每个项目映射到不同的参数,您可以使用 itertools.starmap,即这样做:

from itertools import starmap
result = map(lambda x, *_: x, [(0,1,2),])

但是 sortsorted 的关键参数上没有等效项。

如果您不想在元组中间使用参数, 只需编号:

lambda x, _1, _2, _3, w: x*2 + w

如果您从一些 linter 工具那里收到有关未使用参数的投诉:linter 的目的是建议更易读的代码。我个人的偏好是不要让它妨碍实用,如果发生这种情况,我会毫不犹豫地关闭该行代码的 linter。

否则,您真的必须做“漂亮”的事情——如果是为了取悦您和您的团队,或者仅仅是为了取悦 linter,请运用良好的判断力。在这种情况下,它是编写一个完整的功能,并假装 消耗未使用的参数。

def my_otherwise_lambda(x, unused_1, unused_2, w):
     """My make linter-happy docstring here"""
     unused_1, unused_2  # Use the unused variables
     return 2 * x + w

除了 linter 有问题外,目的是让 lambda 参数可读,然后无论如何建议使用一个完整的函数。 lambda 非常接近在 v.3.0 中被剥离的语言,以保证可读性。

最后但并非最不重要的一点是,如果元组中值的语义是那个有意义的,也许您应该考虑使用一个类来保存其中的值。通过这种方式,您只需将该类的实例传递给 lambda 函数并通过它们各自的名称检查值。

Namedtuple 是一个很好用的方法: 从集合导入 namedtuple

vector = namedtuple("vector", "x y z")

mydata = [(1,10,100), (2,20,200), (3,30,300)]
mydata = [vector(*v) for v in mydata]

sorted_data = sorted(mydata, lambda v: v.x * 2)

关于python - 如何忽略元组的解压缩部分作为 lambda 的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47642568/

相关文章:

python - 使用 Rasterio 和 Fiona 剪切栅格

python - 日期的格式字符串在转换为十进制日和月时无效

javascript - 代码可以在本地运行,但不能在 AWS lambda 上运行

具有分隔值的多个值的 C# app.config

c++ - 元组上的推力排序非常慢

python - 找到数组中上下最接近的值?

python - 正则表达式 : How to filter for two things at once

C++ Lambda、捕获、智能 Ptr 和堆栈 : Why Does this Work?

python - 如果与当前标记相同,则删除句子中的前一个标记 python

python - 对嵌入式元组/字符串进行操作,python