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
相关产品推荐
相关产品推荐

