首页 > 解决方案 > 如何在记录中找到一个单独的属性并在其上形成一个单独的集合?

问题描述

有一个类包含以下信息学生的姓名,他的小组,几何,代数和计算机科学的成绩

def __init__(self,surn,numbgroup,markgeometry,markalgebra,markinformatika):
          self.surn=surn
          self.numbgroup=numbgroup
          self.markgeometry=markgeometry
          self.markalgebra=markalgebra
          self.markinformatika=markinformatika

有类对象,它们存储在列表中 -studinfos []

(Surname, Group, grades in 3 subjects ())

Smith ARP11 3,3,3
Brown ARP12 4,5,3
Jones ARP12 4,4,5
Johnson ARP13 4,5,4
Jensen ARP13 3,3,3
Williams ARP13 5,5,5
Adams ARP11 5,5,5
Wilson ARP12 5,4,5
Taylor ARP11 3,5,3
Anderson ARP11 5,3,5

问题是我需要从这个集合中计算每组这些学生的 GPA。也就是说,我需要从这个集合中按组形成单独的集合,并分别计算它们的平均分数。例如,像这样:

Smith ARP11 3,3,3
Adams ARP11 5,5,5
Taylor ARP11 3,5,3
Anderson ARP11 5,3,5

Brown ARP12 4,5,3
Jones ARP12 4,4,5
Wilson ARP12 5,4,5

Johnson ARP13 4,5,4
Jensen ARP13 3,3,3
Williams ARP13 5,5,5

一般如何计算平均分,不分组,我知道。但我无法弄清楚如何将它们分成单独的列表分组(ARP11, ARP12, ARP13)并分别与每个组一起工作。此外,可以有3个以上的组。

已有库存:

包含要存储的元组的列表。没错,元组中的值是不可变的,这里的问题是如何填充它。

listgroup=[(student.numbgroup, 0)]

未完全实现的功能(仅用于找出组)。数量巨大if,请不要批评,它正确地计算了评价的数量。midlbal变量本身也在工作和测试。sorted 函数也可以单独工作。

def sortgroups(self):
          listgroup=[(student.numbgroup, 0)]
          countfour=0
          countfive=0
          counthree=0
          for student in studinfos:
                 if student.markgeometry==4:
                      countfour+=1
                 if student.markalgebra==4:
                      countfour+=1
                 if student.markinformatika==4:
                      countfour+=1
                 if student.markgeometry==5:
                      countfive+=1
                 if student.markalgebra==5:
                      countfive+=1
                 if student.markinformatika==5:
                      countfive+=1
                 if student.markgeometry==3:
                      counthree+=1
                 if student.markalgebra==3:
                      counthree+=1
                 if student.markinformatika==3:
                      counthree+=1
          for student in studinfos.numbofgroup[i]:
                  listgroup.append(get_numgroup)
                  midbal=((countfive+countfour+counthree)/3)
                  listgroup=[get_numbgroup(),midbal]

标签: pythonpython-3.x

解决方案


我认为根据您的描述,这就是您想要做的。

给定:

class Student:
    def __init__(self,surn,numbgroup,markgeometry,markalgebra,markinformatika):
          self.surn=surn
          self.numbgroup=numbgroup
          self.markgeometry=markgeometry
          self.markalgebra=markalgebra
          self.markinformatika=markinformatika  

学生名单:

Smith ARP11 3,3,3
Brown ARP12 4,5,3
Jones ARP12 4,4,5
Johnson ARP13 4,5,4
Jensen ARP13 3,3,3
Williams ARP13 5,5,5
Adams ARP11 5,5,5
Wilson ARP12 5,4,5
Taylor ARP11 3,5,3
Anderson ARP11 5,3,5  

以及包含每个先前定义的学生的学生实例的学生信息列表,根据类属性 numbgroup 组织数据。

我会这样做:

gl = dict()
for s in studentinfos:
    sd = gl.pop(s.numbgroup, dict())
    sd[s.surn]= [s.markgeometry, s.markalgebra, s.markinformatika]
    gl[s.numbgroup] = sd  
for k, v  in gl.items():
    s = f'Group: {k} \n'
    for std, grds in v.items():
        s += f'    {std}\t{grds[0]}, {grds[1]}, {grds[2]}\n'
    print (s)   

产生:

Group: ARP13 
    Johnson 4, 5, 4
    Jensen  3, 3, 3
    Williams    5, 5, 5

Group: ARP12 
    Brown   4, 5, 3
    Jones   4, 4, 5
    Wilson  5, 4, 5

Group: ARP11 
    Smith   3, 3, 3
    Adams   5, 5, 5
    Taylor  3, 5, 3
    Anderson    5, 3, 5

推荐阅读