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

Python字符串按频率排序时如何更优雅地实现同频字符聚类?

按字符出现频率排序的Python优雅实现

最优实现方案

直接使用Python标准库collections.Counter完成频率统计,对统计结果排序后直接拼接生成结果,性能和可读性都更好:

from collections import Counter

def frequencySort(self, s: str) -> str:
    freq = Counter(s)
    # 排序规则:先按频率倒序,同频按字符本身排序,保证同字符聚类
    sorted_pairs = sorted(freq.items(), key=lambda x: (-x[1], x[0]))
    return ''.join(char * count for char, count in sorted_pairs)

方案优势

  • 用标准库Counter替代手动实现的频率统计循环,是Python场景下统计元素出现次数的公认标准写法,代码精简无冗余。
  • 排序使用元组作为key,天然支持多优先级排序:优先比较第一个元素(负频率,保证高频字符排在前面),频率相等时自动比较第二个元素(字符本身),完全不需要额外修改频率值的hack逻辑,不会出现浮点数精度问题。
  • 直接对频率统计结果排序,排序对象的数量最多为128个(ASCII字符总数),时间复杂度从原方案的O(n log n)降低到O(1)(因为128是常量),字符串长度越大性能优势越明显。

兼容原思路的改进方案

如果想要保留原方案中排序原字符串的逻辑,只需要修改排序key即可,无需调整频率值:

from collections import Counter

def frequencySort(self, s: str) -> str:
    freq = Counter(s)
    sorted_chars = sorted(s, key=lambda x: (-freq[x], x))
    return "".join(sorted_chars)

这个方案同样解决了同频字符混杂的问题,相比用ASCII码除以1000的实现,逻辑更直观,也规避了极端场景下浮点数精度丢失导致的排序错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 11:15:03