Python 将学生姓名和分数排序在最大分数x分以内?

Python 将学生姓名和分数排序在最大分数x分以内?,python,sorting,csv,Python,Sorting,Csv,我有一个这种格式的csv文件,其中一列是姓,另一列是名,另一列是平均值 Word1 Word2 Points World Hello 85 Test1 Test1 81 Test2 Test2 91 (etc.) 我希望程序能找到并打印出学生的单词1、单词2和分数,在最高分数的5分以内。(因此,如果最高分数为91分,那么将列出所有姓名以及从86分(包括在内)到91分的所有分数 到目前为止,我

我有一个这种格式的csv文件,其中一列是姓,另一列是名,另一列是平均值

Word1       Word2        Points
World       Hello        85
Test1       Test1        81
Test2       Test2        91 (etc.)
我希望程序能找到并打印出学生的单词1、单词2和分数,在最高分数的5分以内。(因此,如果最高分数为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

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

您要做的第一步是获得最高分数。您有一个行列表,因此您可以扫描这些行。(我将您的
重命名为
,因为它是一个行列表,而不是一行):

现在,您要根据分数是否在最大值的5分以内进行筛选:

cutoff = 5
result = list(filter(lambda row: float(row[2]) >= max_grade - cutoff, rows))
一、 就个人而言,您更喜欢Python的函数式风格,但当然,您可以使用循环等做类似的事情

max_分数的另一种方法

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

下面是一个简短的示例,说明如何使用以下命令按第三列对行进行排序:

输出:

['Test2', 'Test2', '91']
['World', 'Hello', '85']
['Test1', 'Test1', '81']
sorted
的第一个参数是一个要排序的iterable。方便地说,
reader
是一个iterable,因此我们可以在删除包含列名的第一行后将其作为参数传递

第二个参数是key函数,它将iterable中的一个元素作为参数,并返回要在排序中使用的key。因为我们想按第三列排序,所以一旦我们将其转换为
int
,我们将返回该值。如果我们跳过转换,分数为9的学生将列在分数为89的学生之前,因为
'9'
>按字母顺序大于
'89'


第三个参数只是一个标志,告诉我们要以相反的顺序得到结果,首先是最大的项目。

CSV在字段之间有逗号。上面显示的示例文件没有。是哪一个?这会影响解决方案。它确实是一个CSV文件。字段之间有逗号。我只是试图像在excel中看到的那样显示它。同时添加剩余的代码。
max=rows[0][2]
所需的行数=过滤器(lambda x:x>=max-5,行数)
@MYGz这看起来像是学校作业,所以我只是想帮助解决问题的具体部分,按第三列对行进行排序。Aight。csv也无效。分隔符不显示为常量。有没有办法在csv模块中使用正则表达式分隔符?@MYGz regex不能使用,您可以从中看到选项。我猜是这样的分隔符最初是制表符,后来被转换为介于之间的空格。
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']