Python循环追加候选人平均得票仅返回单值问题排查
Pandas候选人平均得票计算结果异常排查
问题表现
- 代码预期遍历全部候选人标识,计算每个候选人的平均得票数后返回多元素列表
- 实际运行仅返回包含第一个候选人平均得票的单元素列表
- 预期输出参考:
[344.7164179104478, 108.32835820895522, 133.92537313432837, 360.67164179104475, 109.22388059701493, 120.41791044776119, 126.91044776119404]
- 实际错误输出:
[344.7164179104478]
原始实现代码
import pandas as pd def averageCandidateVotes(filename, column): data = pd.read_csv(filename)[column] x = data.mean() return x def averageVotes(filename): candidates = ['brow', 'nade', 'harr', 'hage', 'buch', 'mcre', 'phil', 'moor'] some_list = [] for cand in candidates: some_list.append(averageCandidateVotes(filename, cand)) return some_list
根因定位
核心错误是**return some_list语句的缩进不符合预期**:实际编写代码时该语句被错误缩进至for循环块内部,导致第一次循环完成第一个候选人得票计算、追加到列表后就直接执行return逻辑退出函数,后续候选人的计算逻辑完全没有执行。
除此之外现有代码还存在两个可优化点:
- 每次调用
averageCandidateVotes都会重新读取整个CSV文件,重复IO操作性能极差 - 硬编码的候选人列表没有做列名存在校验,遇到列名拼写不匹配时会直接抛出KeyError中断程序
修复后代码
import pandas as pd def averageCandidateVotes(data_df, column): # 直接接收已读取的DataFrame,避免重复读取文件 return data_df[column].mean() def averageVotes(filename): # 仅读取一次CSV文件 df = pd.read_csv(filename) candidates = ['brow', 'nade', 'harr', 'hage', 'buch', 'mcre', 'phil', 'moor'] res_list = [] for cand in candidates: # 增加列名存在判断,跳过不存在的列避免程序中断 if cand in df.columns: res_list.append(averageCandidateVotes(df, cand)) return res_list
修复说明
- 调整return语句缩进至与for循环同级,保证遍历完全部候选人后再返回结果
- 将CSV读取逻辑移至循环外,仅执行一次文件读取,运行效率提升明显
- 增加列名存在校验,自动跳过CSV中不存在的候选人列,匹配预期输出的元素个数
内容的提问来源于stack exchange,提问作者blacklion
相关产品推荐
相关产品推荐

