'key`函数用于在PEP 3113之后对没有幻数的元组进行排序

时间:2015-03-15 14:42:06

标签: python-3.x lambda coding-style iterable-unpacking

我的程序获得了一个数据来源,其中包含"值"和"出现次数"列,作为元组(value, frequency)的集合。在Python 2.6或2.7中,我这样做:

ls.sort(key=lambda (value, frequency): -frequency)

但是Python 3删除了解包元组参数的能力。它在命名函数中并没有那么多的伤害,因为可以在函数体(Nested arguments in python not compiling)中使用赋值语句解包。但由于lambda正文无法使用赋值语句,因此无法以这种方式解包(Python lambda does not accept tuple argument)。

PEP 3113建议采用此解决方法:

ls.sort(key=lambda row: -row[1])

1 magic number的这种使用在我的口中留下了不好的味道。在Python 3中使用这样的神奇数字是不是惯用的?或者我应该为以前在lambda中使用元组解包的每个案例创建一个命名函数,像这样?

def negative_of_frequency_from_value_frequency_tuple(value_freq):
    value, freq = value_freq
    return -freq

ls.sort(key=negative_of_frequency_from_value_frequency_tuple)

或者我是否应该对提供这些元组的库的作者提出错误,以便返回named tuples而不是普通元组?

1 个答案:

答案 0 :(得分:0)

如果只需要一个级别的解构,就可以使用包装器获得相同的效果。

ls.sort(key=lambda x: (lambda value, frequency: frequency)(*x))

如果您需要多个级别,请使用理解

ls.sort(key=lambda x: next(-frequency for value, frequency in [x]))