Python中如何规避ZeroDivisionError并继续计算薪资平均值
解决薪资平均值计算中的ZeroDivisionError问题
核心问题分析
当某类岗位(比如CT类型的AI Scientist)没有对应薪资数据时,对应的计数变量(如count_ct_ai_scientist)会保持为0,执行除法运算时就会触发ZeroDivisionError。
解决方案
可以通过两种可靠方式处理:
- 方式一:先判断计数是否大于0再计算平均值
在计算前检查计数变量是否大于0,避免除以0的情况;如果计数为0,可赋值为提示文本或None。 - 方式二:用try-except块捕获错误
将除法运算包裹在try块中,捕获ZeroDivisionError并做针对性处理。
修改后的代码示例
方式一:条件判断实现
ft_ai_scientist = 0 count_ft_ai_scientist = 0 ct_ai_scientist = 0 count_ct_ai_scientist = 0 with open('/Users/xxx/Desktop/ds_salaries.csv', 'r') as f: csv_reader = f.readlines() # 跳过CSV表头(如果第一行是表头的话) next(csv_reader) for row in csv_reader: new_row = row.strip().split(',') employment_type = new_row[3] job_title = new_row[4] salary_in_usd = new_row[7] if employment_type == 'FT' and job_title == 'AI Scientist': ft_ai_scientist += int(salary_in_usd) count_ft_ai_scientist += 1 if employment_type == 'CT' and job_title == 'AI Scientist': ct_ai_scientist += int(salary_in_usd) count_ct_ai_scientist += 1 # 计算FT岗位平均值 if count_ft_ai_scientist > 0: avg_ft_ai_scientist = ft_ai_scientist / count_ft_ai_scientist else: avg_ft_ai_scientist = "无有效薪资数据" # 计算CT岗位平均值 if count_ct_ai_scientist > 0: avg_ct_ai_scientist = ct_ai_scientist / count_ct_ai_scientist else: avg_ct_ai_scientist = "无有效薪资数据" print(avg_ft_ai_scientist) print(avg_ct_ai_scientist)
方式二:try-except捕获错误实现
ft_ai_scientist = 0 count_ft_ai_scientist = 0 ct_ai_scientist = 0 count_ct_ai_scientist = 0 with open('/Users/xxx/Desktop/ds_salaries.csv', 'r') as f: csv_reader = f.readlines() next(csv_reader) # 跳过表头 for row in csv_reader: new_row = row.strip().split(',') employment_type = new_row[3] job_title = new_row[4] salary_in_usd = new_row[7] if employment_type == 'FT' and job_title == 'AI Scientist': ft_ai_scientist += int(salary_in_usd) count_ft_ai_scientist += 1 if employment_type == 'CT' and job_title == 'AI Scientist': ct_ai_scientist += int(salary_in_usd) count_ct_ai_scientist += 1 # 处理FT岗位平均值计算 try: avg_ft_ai_scientist = ft_ai_scientist / count_ft_ai_scientist except ZeroDivisionError: avg_ft_ai_scientist = "无有效薪资数据" # 处理CT岗位平均值计算 try: avg_ct_ai_scientist = ct_ai_scientist / count_ct_ai_scientist except ZeroDivisionError: avg_ct_ai_scientist = "无有效薪资数据" print(avg_ft_ai_scientist) print(avg_ct_ai_scientist)
额外优化建议
手动用split(',')处理CSV文件容易出错(比如字段内容包含逗号的情况),建议使用Python内置的csv模块读取数据,代码更健壮:
import csv ft_ai_scientist = 0 count_ft_ai_scientist = 0 ct_ai_scientist = 0 count_ct_ai_scientist = 0 with open('/Users/xxx/Desktop/ds_salaries.csv', 'r') as f: csv_reader = csv.reader(f) next(csv_reader) # 跳过表头 for row in csv_reader: employment_type = row[3] job_title = row[4] salary_in_usd = row[7] if employment_type == 'FT' and job_title == 'AI Scientist': ft_ai_scientist += int(salary_in_usd) count_ft_ai_scientist += 1 if employment_type == 'CT' and job_title == 'AI Scientist': ct_ai_scientist += int(salary_in_usd) count_ct_ai_scientist += 1 # 用三元运算符简化条件判断 avg_ft_ai_scientist = ft_ai_scientist / count_ft_ai_scientist if count_ft_ai_scientist > 0 else "无有效薪资数据" avg_ct_ai_scientist = ct_ai_scientist / count_ct_ai_scientist if count_ct_ai_scientist > 0 else "无有效薪资数据" print(avg_ft_ai_scientist) print(avg_ct_ai_scientist)
内容的提问来源于stack exchange,提问作者Jean-Paul Azzopardi
相关产品推荐
相关产品推荐

