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

Python:如何实现字符统计结果按次数降序、字符升序排序?

解决字符统计排序问题:次数降序+同次数字符升序

我是编程新手,正在解决统计字符串字符出现次数并输出出现次数最多的前3个字符的问题。编写的Python代码如下:

s = input().lower()
b =  []
for i in s:
    templst = []
    templst.append(i)
    templst.append(s.count(i))
    if templst not in b:
        b.append(templst)

final = sorted(b, key=itemgetter(1),reverse=True)
print(final)
for i in final[:3]:
    print(*i, sep=" ")

输入字符串:

szrmtbttyyaymadobvwniwmozojggfbtswdiocewnqsjrkimhovimghixqryqgzhgbakpncwupcadwvglmupbexijimonxdowqsjinqzytkooacwkchatuwpsoxwvgrrejkukcvyzbkfnzfvrthmtfvmbppkdebswfpspxnelhqnjlgntqzsprmhcnuomrvuyolvzlni

得到的final输出为:

[['o', 12], ['m', 11], ['w', 11], ['n', 11], ['t', 9], ['v', 9], ['i', 9], ['p', 9], ['s', 8], ['z', 8], ['r', 8], ['b', 8], ['g', 8], ['k', 8], ['y', 7], ['c', 7], ['q', 7], ['h', 7], ['a', 6], ['j', 6], ['u', 6], ['d', 5], ['f', 5], ['e', 5], ['x', 5], ['l', 5]]

其中出现次数均为11次的'm'、'w'、'n'顺序不符合预期,期望次数相同时按字符的字母顺序升序排列,即顺序为['m',11],['n',11],['w',11]。


解决方案:调整排序的多条件key

Python的sorted()函数支持传入多条件组合的排序key,我们可以构造一个元组作为排序依据,实现「先按次数降序,同次数字符升序」的需求:

方法1:直接修改原代码的排序逻辑

将原排序代码替换为:

# 方式1:使用lambda表达式(无需额外导入)
final = sorted(b, key=lambda x: (-x[1], x[0]))

# 方式2:配合itemgetter使用(需提前导入from operator import itemgetter)
final = sorted(b, key=lambda x: (-itemgetter(1)(x), itemgetter(0)(x)))

原理说明:

  • 元组的排序规则是按元素顺序依次比较:先比较第一个元素-x[1](次数的负数),升序排序时,负数越小(对应原次数越大)的项越靠前,实现次数降序;
  • 当第一个元素相同时,再比较第二个元素x[0](字符本身),按字符的ASCII码升序排列,也就是字母顺序。

方法2:用collections.Counter优化统计逻辑

原代码中每次调用s.count(i)需要遍历整个字符串,时间复杂度为O(n²),对于长字符串效率较低。推荐使用Python内置的Counter工具类,统计更高效简洁:

from collections import Counter

s = input().lower()
# 统计所有字符的出现次数,返回键值对形式的Counter对象
char_counter = Counter(s)
# 按要求排序:次数降序,字符升序
final = sorted(char_counter.items(), key=lambda x: (-x[1], x[0]))
# 输出前3个结果
for char, count in final[:3]:
    print(char, count)

运行后,11次的字符会按m→n→w的顺序排列,完全符合预期。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 17:25:14