在最高得分的x分数内对学生的姓名和分数进行排序?

时间:2017-02-05 02:18:51

标签: python sorting csv

我有一个这种格式的csv文件,其中包含一个包含姓氏的列,另一列包含名字,另一列包含平均值。

Word1       Word2        Points
World       Hello        85
Test1       Test1        81
Test2       Test2        91 (etc.)

我希望程序能够在最高分的5分内找到并打印学生的word1,word2和points。 (因此,如果最高分为91,那么将列出从86(包括)到91的所有名称和所有分数。

到目前为止,我有这个:

import csv
row = []
in = open("scoreaverage.csv", "r")
reading = csv.reader(in)
for line in reading:
    if reading.line_num > 1:  #to skip the header of the csv
        row.append(line)
        ###not sure with the logic from here out to sort all the rows within 5 points of the maximum score

我是业余爱好者,所以非常感谢任何帮助! (不能使用熊猫或任何那些很酷的快捷方式)

2 个答案:

答案 0 :(得分:1)

您想要的第一步是获得最高分。您有一个行列表,因此您可以浏览这些行。 (我正在将您的row重命名为rows,因为它是一个行列表,而不是一行):

from functools import reduce
# ... other code
max_score = reduce(lambda best_score, curr_row: max(float(curr_row[2]), best_score), rows, float('-inf')) 

现在您要根据分数是否在最大值的5个点内进行过滤:

cutoff = 5
result = list(filter(lambda row: float(row[2]) >= max_grade - cutoff, rows))

我个人更喜欢Python的功能风格,但当然你也可以用循环等做类似的事情。

max_score的另一种方法:

max_score = max([row[2] for row in rows])

答案 1 :(得分:0)

以下是如何使用sorted按第三列对行进行排序的简短示例:

import csv

with open('test.csv') as f:
    reader = csv.reader(f, delimiter='\t')
    next(reader)    # Skip column names
    rows = sorted(reader, key=lambda x: int(x[2]), reverse=True)
    print(*rows, sep='\n')

输出:

['Test2', 'Test2', '91']
['World', 'Hello', '85']
['Test1', 'Test1', '81']

sorted的第一个参数是一个将要排序的迭代。方便地reader是一个可迭代的,所以我们可以在删除包含列名的第一行后将其作为参数传递。

第二个参数是关键函数,它将一个元素从iterable中作为参数并返回要在排序中使用的键。由于我们希望按第三列排序,因此我们将其转换为int后返回。如果我们跳过转换,那么得分为9的学生将在得分为89的学生之前列出,因为'9'按字母顺序大于'89'

第三个参数只是一个标志,表示我们希望结果按相反的顺序排列,最先是最好的项目。