我有一个这种格式的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
我是业余爱好者,所以非常感谢任何帮助! (不能使用熊猫或任何那些很酷的快捷方式)
答案 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'
。
第三个参数只是一个标志,表示我们希望结果按相反的顺序排列,最先是最好的项目。