如何实现字符频率降序排序,同频字符按ASCII升序排列?
修改字符频率统计代码,实现频率降序+同频ASCII升序排序
现有一段用于统计字符频率并取Top5的Python代码,当前输出中频率相同的字符(如s和d)顺序不符合预期,需要实现按字符频率降序排序,当频率相同时按ASCII码升序排列的逻辑。
原代码
import sys import string from collections import Counter input_char = str(sys.argv[1]) c = Counter(input_char.lower()) o = {k: c.get(k) for k in list(sorted(c.keys(), key=lambda key: (c.get(key)), reverse=True))[:5]} print(o)
输入命令
python CountPopularChar.py sdsERwweYxcxeewHJesddsdskjjkjrFGe21DS2145o9003gDDS
当前输出
{'s': 7, 'd': 7, 'e': 6, 'j': 4, 'w': 3}
期望输出
{'d': 7, 's': 7, 'e': 6, 'j': 4, 'w': 3}
修改方案
核心调整sorted函数的key参数,让排序规则同时兼顾频率降序和同频字符的ASCII升序:
import sys from collections import Counter input_char = str(sys.argv[1]) c = Counter(input_char.lower()) # 修改排序key:用(-频率, 字符)实现双规则排序 o = {k: c[k] for k in sorted(c.keys(), key=lambda key: (-c[key], key))[:5]} print(o)
关键逻辑说明
- 原代码仅以字符频率作为排序依据,同频字符的顺序由Python默认的字典键顺序决定,无法保证ASCII升序。
- 修改后的排序
key是元组(-c[key], key):-c[key]:将频率取负数,利用默认升序排序实现“频率越高越靠前”的效果;key:当频率相同时,直接以字符本身排序——Python中字符串的默认排序基于ASCII码,因此同频字符会自动按ASCII升序排列。
- 同时简化
c.get(k)为c[k],因为k来自c.keys(),必然存在于Counter中,无需使用get方法。
运行修改后的代码,输入相同命令即可得到期望输出。
内容的提问来源于stack exchange,提问作者theslasher
相关产品推荐
相关产品推荐

