计算一行中的实例数时出现问题



你好,我正在创建一个评分系统,它打开一个.csv文件,并向下列出学生列表,为每个学生计算他们通过了多少次考试,成绩和区别。

样本数据

First Name, Last Name, Test 1, Test 2, Test 3
John,        Doe,        P,       P,       M
Mary,        Jane,       P,       D,       M
Bruce,       Wayne,      P,       M,       D

因此,约翰将有2次通过,1次功绩。玛丽各1个等。这是我正在编写的代码。不幸的是,它是垂直计算成绩的,所以第[1]行是3次通过,第[2]行是1次等等,而不是短距离阅读。有人知道怎么解决这个问题吗?

import csv
import collections
#Create Counter
grades = collections.Counter()
#Open file and read
with open('Results.csv', 'r') as csv_file:
csv_reader = csv.reader(csv_file)

for row in csv_reader:
grades[row[2]] += 1
print('Number of Pass grades: %s' % grades['P'])
print('Number of Merit grades: %s' % grades['M'])
print('Number of Distinction grades: %s' % grades['D'])

您可以计算每一行的通过次数、优点和区别。然后使用list.count()方法将每个记录的通过次数、优点和区别分别横向添加到列表中(详细信息见list.count(

input_data.csv:

First Name,Last Name,Test1,Test2,Test3
John,Doe,P,P,M
Mary,Jane,P,D,M
Bruce,Wayne,P,M,D

code.py:

import csv
with open("input_data.csv") as csv_file:
csv_reader = csv.reader(csv_file)
result = []
header_column = True
for data in csv_reader:
if header_column:
header_column = False
continue        
row = data[:]
row.append(data[2:].count("P"))
row.append(data[2:].count("M"))
row.append(data[2:].count("D"))
result.append(row)
print(result)

输出:

[['John', 'Doe', 'P', 'P', 'M', 2, 1, 0], ['Mary', 'Jane', 'P', 'D', 'M', 1, 1, 1], ['Bruce', 'Wayne', 'P', 'M', 'D', 1, 1, 1]]

解释:

  • 我们跳过result列表的第一行,因为它包含标头信息
  • result是2D列表,其中每个内部列表依次包含以下信息:[First nameLast NameTest1Test2Test3Number of passesNumber of meritsNumber of distinctions]
  • 这里data[2:]确保我们不计算First NameLast Name列中的PMD

替代解决方案:

  • 我们可以使用csv.DictReader,它将把每个记录作为字典

参考文献:

  • 1:list.count上的Python文档

最新更新