首页 > 解决方案 > 如何根据每个科目的最小值来组织学生的分数

问题描述

我有一个文件,其中包含 4 个学生姓名和 4 个科目的分数。第一列包含学生姓名,接下来的 5 列包含学生对每个科目的标记。每一行都是一个不同的学生。使用 Python,我想创建一个包含每个主题的最低分数的列表。

例如:

Name,Math,Art,Science,English    
Jess,43,87,39,38    
Mark,38,28,87,34    
John,77,36,69,99    
Ash,63,89,97,67

输出:

[38,28,39,34]

到目前为止,我已经写了这篇文章,试图创建一个包含数学标记的新列表,然后我将对其进行排序..

csvfile = "sample.csv"

file = open(csvfile,"r")

math = []
for line in file:
    math.append(f[1])

但是,它返回错误消息:

Traceback (most recent call last):
  File ...
    mark1.append(f[2])
TypeError: '_io.TextIOWrapper' object is not subscriptable

为了创建一个包含每行索引 1 分数的新列表,我做错了什么?谢谢

标签: python

解决方案


使用 CSV Reader(非常适合解析 CSV 文件)

参考

代码

更新了@JustinEzequiel 的建议(见评论)

import csv

#https://courses.cs.washington.edu/courses/cse140/13wi/csv-parsing.html
with open('sample.csv', mode='r') as infile:
    # Place students as a list of dictionaries
    reader = csv.DictReader(infile, skipinitialspace = True)

    # Get subjects from header (fieldnames)
    subjects = reader.fieldnames[:]  
    subjects.remove('Name')

    #  Get students names and grades
    lst = [student for student in reader]

    # Find min by subject for all students
    min_scores = [min(student[subject] for student in lst) for subject in subjects]

    print(min_scores)

测试

文件样本.csv

Name,Math,Art,Science,English
Jess,43,87,39,38
Mark,38,28,87,34
John,77,36,69,99
Ash,63,89,97,67

输出

['38', '28', '39', '34']

推荐阅读