使用sorted时如何在lambda函数中解构元组作为排序键?
问题解决:Python sorted函数中lambda解构元组的语法错误
错误原因
sorted()的key参数要求是仅接受单个输入参数的函数,你写的lambda f, e: ...声明了两个参数,不符合函数签名要求,因此触发语法错误。
解决方案
不需要必须改用@dataclass,有几种更轻量的方式实现可读性与功能的兼顾:
1. 直接在lambda内通过索引访问元组元素
这是最简洁的写法,逻辑清晰:
print(sorted(pairs, key=lambda x: -x[1] * 1000 + x[0]))
2. 在lambda内部解构元组并命名(Python 3.8+)
通过分号在lambda内完成解构赋值,实现元素命名:
print(sorted(pairs, key=lambda x: (f, e) := x; -e * 1000 + f))
3. 使用namedtuple/NamedTuple(推荐)
用轻量的命名元组替代普通元组,既保留元组特性,又能通过属性名访问元素,可读性大幅提升:
import math from collections import namedtuple def entropy(probability: float) -> float: if probability == 0: return 0 else: return -probability*math.log(probability)/math.log(2) # 定义命名元组 Pair = namedtuple('Pair', ['frequency', 'uncertainty']) # 生成命名元组列表 pairs = [Pair(frequency/10, entropy(frequency/10)+entropy(1-frequency/10)) for frequency in range(11)] # 排序时直接使用属性名 print(sorted(pairs, key=lambda p: -p.uncertainty * 1000 + p.frequency))
如果需要类型注解,可改用typing.NamedTuple:
from typing import NamedTuple class Pair(NamedTuple): frequency: float uncertainty: float
4. 临时嵌套lambda(不推荐)
通过嵌套lambda实现元组解构,但写法冗余,可读性一般:
print(sorted(pairs, key=lambda x: (lambda f, e: -e * 1000 + f)(*x)))
内容的提问来源于stack exchange,提问作者Nuno
相关产品推荐
相关产品推荐

