如何用Counter模块改写山地数据处理代码并实现统计需求?
实现山脉统计与高度分析的Python代码改进方案
我来帮你完成这个需求的代码实现,咱们一步步拆解清楚:
首先先给出完整的可运行代码,之后再逐个解释关键逻辑:
from collections import Counter, defaultdict from statistics import mean import csv def mountain_ranges(filename): # 初始化Counter统计山脉出现次数,defaultdict存储每个山脉的高度列表 ranges_counter = Counter() mountain_heights = defaultdict(list) err_msg = "Error: File doesn't exist or is unreadable." try: with open(filename, 'r') as handle: reader = csv.reader(handle, delimiter=',') # 假设CSV第一行是表头,先跳过(如果你的CSV没有表头,直接注释掉这行) next(reader) for row in reader: # 请根据你的CSV实际格式调整索引: # 示例假设CSV每行格式是「山脉名,山峰名,高度」,如果是「山脉名,高度」就改成row[1]取高度 range_name = row[0] height = int(row[2]) # 更新计数器和高度字典 ranges_counter[range_name] += 1 mountain_heights[range_name].append(height) # 输出出现次数最多的2个山脉 print("出现次数最多的2个山脉:") for range_name, count in ranges_counter.most_common(2): print(f"- {range_name}: {count} 次") # 计算并输出各山脉的山峰平均高度 print("\n各山脉的山峰平均高度:") for range_name, heights in mountain_heights.items(): avg_height = mean(heights) print(f"- {range_name}: {avg_height:.2f} 米") # 返回高度字典(可转换成普通dict,也直接返回defaultdict) return dict(mountain_heights) except FileNotFoundError: print(err_msg) return None except ValueError: print("Error: 高度数据不是有效的整数,请检查CSV格式。") return None except Exception as e: print(f"Error: 发生未知错误 - {str(e)}") return None
关键逻辑拆解
Counter的用法:
用Counter()初始化计数器后,每次读取到一个山脉名,就用ranges_counter[range_name] += 1累加次数。最后调用most_common(2)就能直接获取出现次数Top2的山脉,这是Counter最实用的功能之一。defaultdict的优势:
defaultdict(list)会自动为新出现的山脉名创建空列表,我们直接用mountain_heights[range_name].append(height)就能把高度添加到对应列表里,不用手动判断键是否存在,省了很多冗余代码。平均高度计算:
借助statistics模块的mean()函数,直接传入山脉的高度列表就能得到平均值,用:.2f格式化后保留两位小数,输出更直观。异常处理优化:
把原来的通用except拆分成了具体异常类型,比如文件不存在、高度格式错误等,能精准提示用户问题所在,而不是模糊的报错信息。
注意事项
请根据你实际的CSV格式调整代码中row的索引:
- 如果CSV每行是「山脉名,高度」,就改成
height = int(row[1]),同时去掉跳过表头的next(reader)(如果没有表头的话); - 如果有表头,一定要用
next(reader)跳过第一行,否则表头会被当成数据统计进去。
内容的提问来源于stack exchange,提问作者Charlotte Grosjean
相关产品推荐
相关产品推荐

