Python中按计数降序、字母升序排序的问题排查与优化
问题排查与高效实现方案
一、现有代码的问题分析
1. 字符统计逻辑错误
你用的正则r'([\w])(\1*)'只能匹配连续重复的字符,没法统计非连续出现的字符次数。比如字符串是abac时,a实际出现2次,但正则会拆成两个单独的a,统计结果直接出错。
2. 排序逻辑错误
最后一步的两次排序完全搞反了优先级:
sorted( (sorted(var,key=lambda x:x[1],reverse=True)) , key=lambda x:x[0])
先按次数降序后,又整体按字符升序排序,导致次数最高的b(3)被排到了a(2)后面,完全违背了“先按计数值降序,计数值相同再按字符升序”的要求。正确做法是用一个排序key同时包含两个条件:以负的计数值实现降序,以字符本身实现升序,一次排序就能搞定。
3. 冗余的字符提取代码
list(map(str,set(i.__getitem__(0))))[0]写法冗余且没必要,捕获组i.group(1)直接就能拿到匹配的单个字符,不需要转成集合再取元素。
二、高效实现方案
Python内置的collections.Counter是专门用来统计可哈希对象出现次数的工具,简洁高效,配合一次排序就能满足需求:
from collections import Counter s = 'aabbbccde' # 统计每个字符的出现次数 char_counts = Counter(s).items() # 排序:先按次数降序,次数相同则按字符升序 sorted_counts = sorted(char_counts, key=lambda x: (-x[1], x[0])) # 输出前3个结果 for char, count in sorted_counts[:3]: print(char, count)
代码说明:
Counter(s)直接统计字符串中每个字符的出现次数,返回类似字典的对象,items()方法得到(字符, 次数)的元组列表。- 排序key
lambda x: (-x[1], x[0]):-x[1]让次数高的排在前面(降序),x[0]让次数相同时字符按字母升序排列。 - 最后切片
[:3]取前3个结果输出,完全符合你的需求。
运行这段代码会输出:
b 3 a 2 c 2
内容的提问来源于stack exchange,提问作者quora question
相关产品推荐
相关产品推荐

