2015-05-19 18 views
0

让我们这个代码为例(按价值排序字典项):寻找一个更好的Python语法到多个参数传递给一个单参数化的λ

sorted(d.items(), key=lambda kv: kv[1]) 

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

现在,this book我见过一些例子使用一个更加美好的语法,这样的:

sorted(d.items(), key=lambda (k,v): v) 

但不幸的是,这给了我一个语法错误(在蟒蛇3.4)。

这样的语法是否存在?在哪个版本?

+0

它工作在Python 2.7.6罚款;我想想知道为什么它不在Python 3 – Pynchia

回答

4

这是不幸的removed in Python3

:-(

当时的想法是,这阻碍了反省,而是盘算着如何的功能是通过签名叫的,这需要分析字节码(语法树)。

2

在Python3 PEP3113除去功能

据我知道有没有解决方法为lambda情况下,你可以做到以下几点:。

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

然后使用f_unpack(lambda k, v: v)。 (您可能必须为f_unpack找到一个更具描述性的名称缩写

3

更换完全拉姆达是用例的operator.itemgetter

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

你是对的,但我总觉得它违背了[zen](https://www.python.org/dev/peps/pep- 0080 /)thingy:“应该有一个,最好只有一个......”(引用来自内存)Lambdas是'itemgetter'的一个严格超集,对于一个特定的情况,还有''itemgetter''可能会更快) –

+2

那么,'operator.itemgetter'是一个) –

+0

请记住''lambda'差不多从Python 3中移除了,因为感觉有更好的解决方案('operatorgetter','attrgetter'和'operatorcaller'来自'operator'模块; 'functools.partial'等)的大部分用例。 – chepner

相关问题