如何将Python 2比较函数转换为Python 3原生key函数实现元组排序
解决方案
完全可以实现符合要求的原生键函数,不需要依赖cmp_to_key,具体实现如下:
def sort_key(coord: tuple[int, int, str]) -> tuple[int, int, int]: x, y, z = coord # 类型优先级:S 排在 E 之前,对应更小的排序权重 type_order = 0 if z == "S" else 1 # y值适配:S类y越大越靠前,取负值后升序等价于原y降序;E类y越小越靠前,直接用原值升序 y_order = -y if z == "S" else y return (x, type_order, y_order)
使用时直接将该函数传入排序方法的key参数即可:
# 示例调用 result = sorted(your_list, key=sort_key)
逻辑说明
键函数返回的三元组会按优先级从左到右依次比较,完全匹配提出的排序规则:
- 第一维度为
x,升序排列,对应原比较函数中x不等时按x升序的逻辑 - 第二维度为类型优先级,S对应0、E对应1,升序排列时S自然排在E前面,匹配「x相等时S类记录排在E类前面」的规则
- 第三维度为适配后的y值:
- 同为S类时,y取负值升序等价于原y值降序,匹配「y值更大的排在前面」的规则
- 同为E类时,直接用y值升序,匹配「y值更小的排在前面」的规则
该实现是Python3原生支持的标准写法,性能比使用cmp_to_key更优:cmp_to_key需要对元素进行两两比较,而键函数仅需要对每个元素计算一次键值即可完成排序。
内容的提问来源于stack exchange,提问作者Abhijit Sarkar
相关产品推荐
相关产品推荐

