如何将计数器应用于循环中调用的多个类实例?

时间:2017-10-16 01:43:02

标签: python class dictionary instance counter

我正在编写一个代码作为我教授的课程的成绩单。虽然我有一个没有类的工作代码,但我正在学习并尝试将类合并到我的代码中。

我有一个班级StudentSpecs。类中定义了很多东西(例如名称和ID号),但相关部分是:

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

使用这个,我的代码(可根据要求提供,但遗漏以缩短帖子)将读取.csv文件(通过MS Excel)并为文件中的每一行创建StudentSpecs类的实例(每行是不同的学生,每列代表不同的作业分数)。所以,我可以像这样循环访问每个学生的总积分和字母等级。

## 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轴将存储具有相应数量的学生数量信级。我可以使用numpymatplotlib制作直方图。但是,我不知道如何将Counter应用于我的类实例。我的尝试如下。

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方法,但在这种情况下我不确定如何应用它。

如何将计数器应用于我的班级实例?

2 个答案:

答案 0 :(得分:1)

你可以传递一个生成器表达式并让Counter完成其余的工作。

c = Counter(student.grade for student in classroom)

答案 1 :(得分:0)

此解决方案可行。但我很想知道如何处理类实例。

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})