【问题标题】:How can I apply a Counter to multiple class instances called in a loop?如何将 Counter 应用于循环中调用的多个类实例?
【发布时间】:2017-10-16 01:43:02
【问题描述】:

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

我有一堂课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 方法,尽管我不确定在这种情况下如何应用它。

如何将计数器应用到我的类实例?

【问题讨论】:

  • 请注意,如果您要处理大量数字,使用numpypandas 可能更有意义。在 pandas 中,这就像 value_counts() 一样简单
  • 我还没有熟悉熊猫,但感谢您的提醒。

标签: python class dictionary instance counter


【解决方案1】:

您可以只传递一个生成器表达式,然后让Counter 完成剩下的工作。

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

【讨论】:

    【解决方案2】:

    此解决方案将起作用。但我很想了解更多关于如何处理类实例的信息。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-16
      • 2016-10-15
      • 2013-07-03
      • 1970-01-01
      • 2018-07-16
      相关资源
      最近更新 更多