如何用原生Python不借助第三方库统计文件Top10高频姓氏
问题排查与实现方案
现有代码核心问题
- 变量类型不匹配:你将
surname_dict定义为列表类型,却在后续调用了字典专属的items()方法,运行会直接抛出属性错误。同时当前逻辑仅收集了去重后的姓氏列表,完全没有统计每个姓氏的出现频次,后续排序没有数据依据。 - 计数逻辑混乱:第一个循环中
count变量的作用是统计不重复姓氏的总数,第二个循环复用该变量控制输出次数时,初始值已经不是0,无法准确只输出前10条结果。 - 排序规则错误:默认
sorted是升序排序,要取频次最高的前10,需要设置倒序排列,否则输出的是频次最低的结果。
正确实现方案
不需要引入任何第三方库,仅用原生Python字典和排序即可完成20万条数据的统计,性能足够。
实现代码
# 初始化频次统计字典,key是姓氏,value是出现次数 surname_count = {} # 你的姓氏白名单样本 valid_surnames = ['KRISTIANSEN', 'OLDERVIK', 'GJERSTAD', 'VESTLY SKIVIK', 'NYMANN', 'ØSTBY', 'LINNERUD', 'REMLO', 'SKARSHAUG', 'ELI', 'ADOLFSEN'] # 遍历数据统计频次 for item in data_list: lastname = item["lastname"] # 如果只需要统计你提供的样本姓氏,保留下面这行判断,不需要可以直接删除 if lastname not in valid_surnames: continue # 频次累加逻辑 if lastname in surname_count: surname_count[lastname] += 1 else: surname_count[lastname] = 1 # 按频次倒序排序 sorted_surnames = sorted(surname_count.items(), key=lambda x: x[1], reverse=True) # 输出前10个高频姓氏 for idx, (name, count) in enumerate(sorted_surnames): if idx >= 10: break print(f"姓氏:{name},出现次数:{count}")
可选优化说明
如果后续数据规模继续扩大,可以在统计频次阶段就维护一个固定长度的前10列表,无需全量统计完成后再排序,可进一步降低内存开销,20万条数据规模下当前方案性能完全够用。
内容的提问来源于stack exchange,提问作者Nicholai Mørch Rindarøy
相关产品推荐
相关产品推荐

