Python中以平方为键的sorted排序代码逻辑疑问
逐段拆解
sorted(range(-3,4), key=lambda x: x*x) 运行逻辑 第一步:生成待排序的原始序列
Python执行这段代码时,会从最基础的参数开始依次计算,首先求值传入sorted的第一个实参range(-3, 4):
- range遵循左闭右开规则:从起始值-3开始,每次步长为1,取所有小于结束值4的整数
- 展开为可遍历的完整元素列表,就是原始待排序列表:
[-3, -2, -1, 0, 1, 2, 3]
这一步只是准备好需要排序的所有元素,此时还没有启动排序流程。
第二步:理解key参数的实际作用
明确sorted的排序核心规则,避免对key功能的误解:
- 传入的
key=lambda x: x*x本质是一个一次性的临时换算函数,等价于日常写的普通函数:def get_sort_value(x): return x * x - key函数不会修改原始列表里的任何元素,只会给列表中的每一个元素,单独计算一个用于排序的参考值(可以理解为给每个元素打一个排序用的分数)
- 最终sorted是按照这个参考分数从小到大排序,完全不会按照元素本身的数值大小排序
第三步:为每个原始元素计算排序参考值
把原始序列的每个元素代入上面的换算函数,得到的对应参考值如下:
| 原始元素 | 计算得到的排序参考值 |
|---|---|
| -3 | (-3)² = 9 |
| -2 | (-2)² = 4 |
| -1 | (-1)² = 1 |
| 0 | 0² = 0 |
| 1 | 1² = 1 |
| 2 | 2² = 4 |
| 3 | 3² = 9 |
第四步:按参考值排序,输出最终结果
排序过程完全遵循两个固定规则:
- 优先按照元素对应的排序参考值从小到大排列
- 如果两个元素的参考值完全相等,就保留这两个元素在原始序列里的先后相对位置(这是Python内置sorted的稳定排序特性)
按照规则的排列拆解:
- 参考值最小的是0,对应元素0,排在第一位
- 参考值为1的元素有两个:-1、1。因为-1在原始序列中位置早于1,所以顺序保留为-1在前、1在后,排在0之后
- 参考值为4的元素有两个:-2、2。同理,-2在原始序列位置早于2,顺序保留为-2在前、2在后,排在1之后
- 参考值为9的元素有两个:-3、3。-3在原始序列位置早于3,顺序保留为-3在前、3在后,排在2之后
最终拼接得到的结果就是代码运行输出的:[0, -1, 1, -2, 2, -3, 3]
常见认知补充
如果去掉key参数,sorted会直接按照元素本身的数值大小排序,输出结果会是[-3, -2, -1, 0, 1, 2, 3],和上述结果的差异核心,就是加了平方值作为排序参考。
内容的提问来源于stack exchange,提问作者user14025936
相关产品推荐
相关产品推荐

