为什么相同key函数下Python的list.sort与sorted排序结果不同
问题核心原因说明
两个API的行为差异是导致结果不同的根本原因
sorted为非原地排序函数,执行时会生成一个新的列表作为返回结果,整个排序过程不会修改传入的原始列表。你在key函数中调用numbers.count(x)时,每次统计的都是原始列表的元素出现频率,数值准确,因此排序结果符合预期。list.sort为原地排序方法,执行时会直接修改当前列表的元素顺序。你的key函数直接依赖正在被排序的numbers列表的count结果,排序执行过程中列表元素位置已经被打乱,此时统计得到的频率不是原始列表的真实频率,因此最终排序结果错误。
推荐的兼容写法
不要在key函数中依赖正在被排序的列表的动态状态,提前统计所有元素的出现频率,再进行排序,此时使用list.sort和sorted的结果完全一致:
from collections import Counter lista = [3, 4, 11, 13, 11, 4, 4, 7, 3] def func(numbers: list): # 提前统计频率,避免后续依赖变化的列表状态 freq_counter = Counter(numbers) numbers.sort(key=lambda x: (-freq_counter[x], x)) return numbers result = func(lista) print(result) # 输出:[4, 4, 4, 3, 3, 11, 11, 7, 13]
内容的提问来源于stack exchange,提问作者wangjianyu
相关产品推荐
相关产品推荐

