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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 13:39:18