如何提升Python字符统计函数的执行效率?
优化字符频次统计函数的执行速度
需求说明:
传入由字母或表情符号组成的字符列表(例:a=['a','b','f','a','g', '😊']),统计每个字符的出现次数,返回出现次数最多且字母序最靠前的字符(若多个字符频次相同,如'a'和'b',则返回'a')。
原实现代码:
def occorrenze(a): dix={} #dictionary for i in a: if i in dix: dix[i]+=1 else: dix[i]=1 # 找出字典中的最大频次 maxvalues=max(dix.values()) # 筛选出所有频次等于最大值的字符 maxkeys= [k for k,v in dix.items() if v == maxvalues] # 返回字母序最靠前的字符 return sorted(maxkeys)[0]
优化方向及实现
原代码的核心逻辑可以通过Python内置工具简化,同时大幅提升执行效率:
用
collections.Counter替代手动统计频次Counter是Python标准库中专门用于频次统计的工具,底层由C实现,比手动循环字典的效率高很多,处理大规模列表时优势尤其明显。用
max()函数的key参数一步得到结果
无需先找最大频次、再筛选字符、最后排序,直接通过自定义排序规则,让max()函数一次返回符合要求的字符:- 排序规则设为
lambda x: (-x[1], x[0]):先按频次降序(负号实现降序),频次相同时按字符升序,完全匹配需求。
- 排序规则设为
优化后的代码:
from collections import Counter def occorrenze(a): counts = Counter(a) # 直接按规则取最大值对应的字符 return max(counts.items(), key=lambda x: (-x[1], x[0]))[0]
效率对比
- 原代码需要三次遍历:一次统计频次,一次找最大频次,一次筛选并排序;
- 优化后仅需两次遍历:
Counter统计一次,max()遍历一次,且Counter的遍历效率远高于手动循环。
内容的提问来源于stack exchange,提问作者Francesco
相关产品推荐
相关产品推荐

