You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按频率对列表排序?现有sorted代码输出不符合预期

问题原因

你的代码中,sorted使用items.count作为排序键时,当多个元素的频率相同时,会保留它们在原列表中的相对顺序。原列表里6和2的出现顺序是6→2→6→2,所以排序后同频率的元素会维持这个分散的排列,导致出现[4,4,4,4,6,2,2,6]的结果。

解决方案

要让同频率的元素集中排列,需要给排序键增加第二个维度:在频率相同的情况下,按元素本身的值(或其他规则)排序,确保相同元素的排序键一致,从而被归在一起。

方案1:优化排序键(简单但效率一般)

直接修改key为包含负频率和元素本身的元组,先按频率降序,再按元素升序(保证同频率元素集中):

items = [4, 6, 2, 2, 6, 4, 4, 4]
result = sorted(items, key=lambda x: (-items.count(x), x))
print(result)  # 输出: [4, 4, 4, 4, 6, 6, 2, 2]

方案2:先统计频率(高效推荐)

使用collections.Counter先一次性统计所有元素的频率,避免排序时重复调用count遍历列表(时间复杂度从O(n²)降到O(n log n)):

from collections import Counter

items = [4, 6, 2, 2, 6, 4, 4, 4]
freq_counter = Counter(items)
result = sorted(items, key=lambda x: (-freq_counter[x], x))
print(result)  # 输出: [4, 4, 4, 4, 6, 6, 2, 2]

原理说明

排序键(-freq_counter[x], x)中:

  1. -freq_counter[x]:用负号实现频率降序排列;
  2. x:当频率相同时,按元素本身的值升序排列,这样相同元素会被排在一起,同时6(值更大)会排在2前面,符合你的预期。

内容的提问来源于stack exchange,提问作者Vincent Thai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 14:03:22