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

如何实现字符频率降序排序,同频字符按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):
    1. -c[key]:将频率取负数,利用默认升序排序实现“频率越高越靠前”的效果;
    2. key:当频率相同时,直接以字符本身排序——Python中字符串的默认排序基于ASCII码,因此同频字符会自动按ASCII升序排列。
  • 同时简化c.get(k)为c[k],因为k来自c.keys(),必然存在于Counter中,无需使用get方法。

运行修改后的代码,输入相同命令即可得到期望输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 14:15:30