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

