sorted函数key参数使用返回元组的复杂lambda表达式的原理疑问
原理讲解
基础规则前置说明
- Python
sorted函数传入key参数后,会先为序列内每一个元素生成对应的key值,最终排序完全按照key值的大小关系执行,不会直接比较原元素。 - Python比较元组时会按索引顺序依次对比对应位置的元素:只要前一个位置的元素能确定大小关系,就直接返回对比结果,不会再对比后续位置的元素;只有前序位置元素相等时,才会继续对比下一个位置的元素。
- Python中布尔值属于int的子类,
False等价于0,True等价于1,排序时False会排在True前面。
示例1:sorted([3, 1, None], key=lambda x: (x is None, x))
首先为每个元素计算key值:
- 元素
1:1 is None返回False,key为(False, 1) - 元素
3:3 is None返回False,key为(False, 3) - 元素
None:None is None返回True,key为(True, None)
排序时先对比元组第一个元素:False < True,所以两个数值型元素的key天然排在None的key前面,不会触发二者第二个位置元素(int和None)的比较,自然不会报TypeError。
两个数值型元素的key第一个位置都是False,继续对比第二个位置的数值:1 < 3,所以最终排序结果为[1, 3, None]。
示例2:sorted([3, 1, None], key=lambda x: (x is not None, x))
计算每个元素的key值:
- 元素
1:1 is not None返回True,key为(True, 1) - 元素
3:3 is not None返回True,key为(True, 3) - 元素
None:None is not None返回False,key为(False, None)
排序时对比元组第一个元素:False < True,所以None的key排在最前面,同样不会触发int和None的跨类型比较。后续两个数值型元素按第二个位置的数值排序,最终结果为[None, 1, 3]。
内容的提问来源于stack exchange,提问作者Andrii Yurchuk
相关产品推荐
相关产品推荐

