python lambda表达式中有两个或多个位置参数

oiopk7p5  于 2023-01-24  发布在  Python
关注(0)|答案(1)|浏览(114)

给定以下列表:

arr = [1, 5, 2, 6, 3, 7, 4]
cmds = [[1, 3, 2], [3, 5, 1], [2, 7, 4]]

对于cmds中的每个命令,我希望获得

[arr[1:3][2], arr[3:5][1], arr[2:7][4]]

我试过:

list(map(lambda x: arr[x[0]:x[1]][x[2]], cmds))

但是我能写一个比上面更简洁的代码吗?我想使用3个位置参数i,j,k而不是单独使用x:

list(map(lambda i, j, k: arr[i:j][k], cmds)) # This gives TypeError
pod7payv

pod7payv1#

函数签名中的参数解包在Python 3中已经被移除(参见this answer)。
以下是一些替代方案:

    • 解决方案1:**

如果你想用干净的代码获得同样的效果,@bereal的答案是一个不错的选择:

[arr[i:j][k] for i, j, k in cmds]

这是一个for循环/列表解析,因此允许解包。

    • 解决方案2:**

如果您坚持使用map,可以使用nested lambdas

list(map(lambda cmd: (lambda i,j,k: arr[i:j][k])(*cmd), cmds))

在外部lambda中,cmd被赋值为cmds中的一个元素,它对应于一个长度为3的列表。这个外部lambda的返回值是一个IIFE,它定义了一个带3个参数的内部lambda,我们通过从外部lambda解包cmd参数来传入它。

    • 解决方案3:**

这张是@KellyBundy:

list(map(lambda i,j,k: arr[i:j][k], *zip(*cmds)))

在本例中,这相当于

arr = [1, 5, 2, 6, 3, 7, 4]
cmds = [[1, 3, 1], [3, 5, 1], [2, 7, 4]]

c1 = (1, 3, 2)
c2 = (3, 5, 7)
c3 = (1, 1, 4)
list(map(lambda i,j,k: arr[i:j][k], c1, c2, c3))

相关问题