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
相关产品推荐
相关产品推荐

