如何将计数器应用于循环中调用的多个 class 实例?
How can I apply a Counter to multiple class instances called in a loop?
我正在编写代码作为我教的 class 的成绩册。虽然我有一个没有 classes 的工作代码,但我正在学习并尝试将 classes 合并到我的代码中。
我有一个classStudentSpecs
。 class里面定义了很多东西(比如名字和身份证号码)但是相关的部分是:
class AstronomyLab154L:
class StudentSpecs:
def __init__(self, points=None, grade=None):
self.points = points
self.grade = grade
def __str__(self):
return "\nTotal Points: %s \nGrade: %s" %(self.points, self.grade)
def set_points(self, points):
self.points = points
def set_grade(self, grade):
self.grade = grade
def get_points(self, points):
return self.points
def get_grade(self, grade):
return self.grade
使用这个,我的代码(可根据要求提供但省略以缩短 post)将读取 .csv 文件(通过 MS Excel)并创建 StudentSpecs
class 文件中的每一行(每一行代表不同的学生,每一列代表不同的作业分数)。所以,我可以像这样循环访问每个学生的总分和字母等级。
## classroom = list of student instances
for student in classroom:
print(student.points, student.grade)
## example of output
88.0 B
94.0 A
82.5 B-
52.0 F
我的目标是创建 classroom
数据的直方图,这样 x 轴刻度标签(以箱为中心)将存储字母成绩,y 轴将存储学生人数相应的字母等级。我可以使用 numpy
和 matplotlib
制作直方图。但是,我不知道如何将 Counter
应用于我的 class 实例。我的尝试如下。
from collections import Counter
def display_classroom_specs(classroom):
## initialize dict since Counter is a dict
grade_counts = {}
## update dictionary for each student in classroom
for student in classroom:
grade_counts += Counter(student.grade) ## y-axis of histogram
return grade_counts
print(display_classroom_specs(classroom))
## throws an error
TypeError: unsupported operand type(s) for +=: 'dict' and 'Counter'
我想我应该使用 dictionary.update
方法,尽管我不确定在这种情况下如何应用它。
如何将计数器应用于我的 class 个实例?
此解决方案有效。但我很想了解更多有关如何处理 class 实例的信息。
def display_classroom_specs(classroom):
grade_counts = []
for student in classroom:
grade_counts.append(student.grade)
grade_counts = Counter(grade_counts)
print(grade_counts)
display_classroom_specs(classroom)
## example output
Counter({'A': 1}, {'B': 1}, {B-: 1}, {F: 1})
您可以只传递一个生成器表达式,让 Counter
完成其余的工作。
c = Counter(student.grade for student in classroom)
我正在编写代码作为我教的 class 的成绩册。虽然我有一个没有 classes 的工作代码,但我正在学习并尝试将 classes 合并到我的代码中。
我有一个classStudentSpecs
。 class里面定义了很多东西(比如名字和身份证号码)但是相关的部分是:
class AstronomyLab154L:
class StudentSpecs:
def __init__(self, points=None, grade=None):
self.points = points
self.grade = grade
def __str__(self):
return "\nTotal Points: %s \nGrade: %s" %(self.points, self.grade)
def set_points(self, points):
self.points = points
def set_grade(self, grade):
self.grade = grade
def get_points(self, points):
return self.points
def get_grade(self, grade):
return self.grade
使用这个,我的代码(可根据要求提供但省略以缩短 post)将读取 .csv 文件(通过 MS Excel)并创建 StudentSpecs
class 文件中的每一行(每一行代表不同的学生,每一列代表不同的作业分数)。所以,我可以像这样循环访问每个学生的总分和字母等级。
## classroom = list of student instances
for student in classroom:
print(student.points, student.grade)
## example of output
88.0 B
94.0 A
82.5 B-
52.0 F
我的目标是创建 classroom
数据的直方图,这样 x 轴刻度标签(以箱为中心)将存储字母成绩,y 轴将存储学生人数相应的字母等级。我可以使用 numpy
和 matplotlib
制作直方图。但是,我不知道如何将 Counter
应用于我的 class 实例。我的尝试如下。
from collections import Counter
def display_classroom_specs(classroom):
## initialize dict since Counter is a dict
grade_counts = {}
## update dictionary for each student in classroom
for student in classroom:
grade_counts += Counter(student.grade) ## y-axis of histogram
return grade_counts
print(display_classroom_specs(classroom))
## throws an error
TypeError: unsupported operand type(s) for +=: 'dict' and 'Counter'
我想我应该使用 dictionary.update
方法,尽管我不确定在这种情况下如何应用它。
如何将计数器应用于我的 class 个实例?
此解决方案有效。但我很想了解更多有关如何处理 class 实例的信息。
def display_classroom_specs(classroom):
grade_counts = []
for student in classroom:
grade_counts.append(student.grade)
grade_counts = Counter(grade_counts)
print(grade_counts)
display_classroom_specs(classroom)
## example output
Counter({'A': 1}, {'B': 1}, {B-: 1}, {F: 1})
您可以只传递一个生成器表达式,让 Counter
完成其余的工作。
c = Counter(student.grade for student in classroom)