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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:14:19