为何sort()带key函数无效果而sorted()正常工作?
问题解答
首先明确:你贴的代码里,nums.sort(key=lambda x: nums.count(x)) 正常情况下应该能修改原列表,得到 [4, 1, 2, 2],和 sorted() 的结果一致。
如果出现你说的 sort() 没改变列表的情况,最可能的原因是你不小心把 sort() 的返回值赋值给了 nums——因为 list.sort() 是原地排序,返回值是 None,如果写了 nums = nums.sort(...),那 nums 会变成 None,看起来就像原列表没被修改。但如果你的代码确实和你贴的一样,那大概率是测试时的其他小失误。
至于你怀疑的“原地排序导致问题”,其实核心逻辑是:sorted() 基于原始列表生成新列表,list.sort() 在原列表上修改,但两者在计算 key 时的逻辑,在你的例子里本应一致——因为 nums.count(x) 统计的是元素出现的总次数,和元素位置无关,不管列表怎么排序,次数都不会变。
不过你的写法存在效率问题:每次调用 nums.count(x) 都会遍历整个列表,排序的时间复杂度会变成 O(n²)。更高效可靠的写法是先预计算所有元素的出现次数,再用这个结果作为排序的 key:
from collections import Counter nums = [2, 4, 1, 2] count_map = Counter(nums) nums.sort(key=lambda x: count_map[x]) print(nums)
这样不仅效率更高(O(n) 统计次数 + O(n log n) 排序),还能避免任何因列表修改可能带来的潜在问题——毕竟 count_map 是基于原始列表生成的固定映射。
内容的提问来源于stack exchange,提问作者Ksuvo
相关产品推荐
相关产品推荐

