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

Python学生项目分配:项目指数计算代码正确性验证

代码实现分析

你的这段代码核心功能完全符合需求,能够正确计算每个项目的Wayne指数,但存在几个细节可以优化:

一、核心逻辑的正确性

代码的核心流程完全匹配需求:

  • 从CSV文件读取学生志愿数据
  • 统计每个项目被作为第一、第二、第三志愿的人数
  • 按照公式 Index(P)=50*第一志愿人数 +25*第二志愿人数 +1*第三志愿人数 计算指数并输出

二、存在的问题与优化方案

1. 重复志愿统计错误

如果有学生重复填报同一个项目(比如同时把项目1填为第一和第二志愿),preferences.index(preference) 会始终返回该项目第一次出现的位置,导致第二志愿的重复项目被错误统计为第一志愿。

优化代码示例:

import pandas as pd
df = pd.read_csv('student_Record.csv')

project_preferences = {}
for index, row in df.iterrows():
    # 按志愿顺序直接处理,避免重复志愿的统计错误
    for idx, col_name in enumerate(['Pref_1', 'Pref_2', 'Pref_3']):
        project = int(row[col_name])
        if project not in project_preferences:
            project_preferences[project] = [0, 0, 0]
        project_preferences[project][idx] += 1

# 计算并输出指数
wayne_index = {p: 50*cnt[0]+25*cnt[1]+cnt[2] for p, cnt in project_preferences.items()}
for project, index_val in wayne_index.items():
    print(f"Wayne index for Project {project}: {index_val}")

2. 大数据场景下的性能问题

df.iterrows() 是逐行遍历,当学生数据量很大时效率较低。更符合Pandas最佳实践的方式是用向量化操作统计频次:

优化代码示例:

import pandas as pd
df = pd.read_csv('student_Record.csv')

# 分别统计三个志愿列中各项目的出现次数
pref1 = df['Pref_1'].value_counts().rename('pref1')
pref2 = df['Pref_2'].value_counts().rename('pref2')
pref3 = df['Pref_3'].value_counts().rename('pref3')

# 合并数据,缺失的志愿数补0
merged_data = pd.concat([pref1, pref2, pref3], axis=1).fillna(0)
merged_data['wayne_index'] = 50 * merged_data['pref1'] + 25 * merged_data['pref2'] + merged_data['pref3']

# 输出结果
for project, row in merged_data.iterrows():
    print(f"Wayne index for Project {int(project)}: {int(row['wayne_index'])}")

3. 文件名匹配问题

代码中读取的是 sample_data.csv,但需求中提到的数据源是 student_Record.csv,需要确保文件名一致,避免读取失败。


内容的提问来源于stack exchange,提问作者retrixsvk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 21:07:31