Python列表排序中key参数使用count方法的差异疑问
为什么两段列表排序代码结果不同?
核心原因在于**sort的key函数是否依赖于正在被修改的原列表**:
代码1的工作逻辑
a = [1,3,4,5,1,7,9,9,9,9,9,1,3,2] b = a.copy() a.sort(key=b.count, reverse=True)
这里b是原列表a的完整拷贝,b的内容在排序过程中完全不变。
sort会为a中的每个元素x,调用b.count(x)计算其在原列表中的出现次数(这个次数是固定的)。- 按照次数从高到低排序:9出现5次→1出现3次→3出现2次→其余元素各1次,最终得到预期的排序结果。
代码2的问题所在
a = [1,3,4,5,1,7,9,9,9,9,9,1,3,2] a.sort(key=a.count, reverse=True)
这里key函数是a.count,而a是正在被原地排序的列表。
- Python的
list.sort()是原地排序算法,排序过程中会不断调整a内元素的顺序。虽然元素的总出现次数没有变化,但a.count(x)是实时遍历当前a列表统计次数。 - 关键问题:
sort算法执行时会多次调用key函数(而非预先计算所有元素的key值)。当列表元素顺序被修改后,后续调用a.count(x)时遍历的是已经部分排序的列表,这种“一边修改列表一边基于修改后的列表计算排序依据”的依赖会打乱算法的内部逻辑,最终导致排序失败,列表保持原顺序。
内容的提问来源于stack exchange,提问作者Theja
相关产品推荐
相关产品推荐

