我的程序获得了一个数据来源,其中包含"值"和"出现次数"列,作为元组(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而不是普通元组?
答案 0 :(得分:0)
如果只需要一个级别的解构,就可以使用包装器获得相同的效果。
ls.sort(key=lambda x: (lambda value, frequency: frequency)(*x))
如果您需要多个级别,请使用理解
ls.sort(key=lambda x: next(-frequency for value, frequency in [x]))