寻找更好的python语法将多个参数传递给单个参数化lambda

寻找更好的python语法将多个参数传递给单个参数化lambda,python,syntax,lambda,Python,Syntax,Lambda,让我们以这段代码为例(按值对dict项进行排序): 键作为单参数函子的定义决定了这个丑陋的lambda 现在,在中,我看到了一些使用更好语法的示例,如: sorted(d.items(), key=lambda (k,v): v) 但是,不幸的是,这给了我一个语法错误(在Python3.4下) 这种语法存在吗?哪个版本 这很不幸 :-( 其想法是,这会妨碍内省。与其弄清楚签名如何调用函数,还需要分析字节码(而不是语法树)。在Python3中删除了该功能 据我所知,lambda案例没有解决办法。

让我们以这段代码为例(按值对dict项进行排序):

键作为单参数函子的定义决定了这个丑陋的lambda

现在,在中,我看到了一些使用更好语法的示例,如:

sorted(d.items(), key=lambda (k,v): v)
但是,不幸的是,这给了我一个语法错误(在Python3.4下)

这种语法存在吗?哪个版本

这很不幸

:-(


其想法是,这会妨碍内省。与其弄清楚签名如何调用函数,还需要分析字节码(而不是语法树)。

在Python3中删除了该功能

据我所知,
lambda
案例没有解决办法。您可以执行以下操作:

def f_unpack(f):
   def unpacking(args):
       return f(*args)
   return unpacking

然后使用
f\u unpack(lambda k,v:v)
(您必须为
f\u unpack

找到一个更具描述性的简称,替换lambda是
操作符的用例。itemgetter

sorted(d.items(), key=operator.itemgetter(1))

它在Python2.7.6中运行良好;我和你一样想知道为什么它在Python3中运行不正常你是对的,但我总是觉得它与以下内容背道而驰:“应该有一个,最好只有一个……”(引用自内存)。lambda是'itemgetter
的严格超集。对于特定情况,还有
itemgetter`(这可能更快)。嗯,
operator.itemgetter
是一种明显的正确方法;)请记住,
lambda
几乎从Python3中删除了,因为感觉有更好的解决方案(
itemgetter
attrgetter
methodcaller
来自
operator
模块;
functools.partial
等)用于大多数用例。
sorted(d.items(), key=operator.itemgetter(1))