【问题标题】:pulling data from a list of lists if each list meets a condition如果每个列表都满足条件,则从列表列表中提取数据
【发布时间】:2018-07-14 03:10:16
【问题描述】:

我正在尝试在我构建的类中获得一种工作方法。这个类累积给定学生的课程历史。每门课程都是一个列表(姓名、成绩、学分等),是该学生所有课程总列表的一部分。这是一个示例课程历史:

[['English 1', 4, 3, 'Fall', '2009'],
['English 2', 3.7, 3, 'Spring', '2010'],
['English 3', 2.7, 3, 'Fall', '2010'],
['English 4', 3.0, 3, 'Spring', '2011'],
['English 5', 3.7, 3, 'Fall', '2011'],
['English 6', 3.3, 3, 'Spring', '2012'],
['Math 1', 3.3, 3, 'Fall', '2009'],
['Math 2', 2.7, 3, 'Spring', '2010'],
['Science 1', 3.7, 4, 'Fall', '2009'],
['Science 2', 4, 4, 'Spring', '2010']]

我可以计算出累积 GPA,但我发现很难确定一个学期的 GPA。这是我的相关代码:

class StudentInfo(object):
    def __init__(self, last, first, dob):
        self.last=last
        self.first=first
        self.dob=dob
        self.gradehist=[]
    def __add__(self, course):
        return self.gradehist.append(course)
    def cumulativegpa(self):
        cred = [item[2] for item in self.gradehist]
        grad = [item[1] for item in self.gradehist]
        gc = [grad[i]*cred[i] for i in range(len(grad))]
        hrs = sum(cred)
        gpasum = sum(gc)
        cumgpa = gpasum/hrs
        return cumgpa
    def semgpa(self, x, y):
        semcred=[]
        semgrad=[]
        for i in self.gradehist:
            if self.gradehist[3] == x and self.gradehist[4] == y:
                semcred.append([item[2] for item in self.gradehist])
        for i in self.gradehist:
            if self.gradehist[3] == x and self.gradehist[4] == y:
                semgrad.append([item[1] for item in self.gradehist])
        return semcred, semgrad`

s1=StudentInfo('Bob','Dole', '1-1-1911')
s1 + ['English 1', 4, 3, 'Fall', '2009']
s1 + ['English 2', 3.7, 3, 'Spring', '2010']
etc

当我输入 s1.cumulativegpa() 时,它会返回正确的总 gpa,但 s1.semgpa('Fall','2009') 会返回 "[],[]" 我哪里错了?

编辑:更新 def semgpa(self, x, y): 以包含

for course in self.gradehist: if course[3] == x and course[4] == y: semcred.append([item[2] for item in course])

【问题讨论】:

  • 您正在迭代gradehist,但随后您访问的是gradehistself.gradehist[3] 中的第四个值,而不是内部列表i[3] 的第四个值。您还应该努力将事物命名得更具描述性,这有助于及早发现此类问题。
  • 谢谢,这绝对是一个错误。我已切换到if i[3] == x and i[4] == y,但仍然得到空列表。
  • 您是否更改了所有错误地使用self.gradehist 而不是i 的地方?您能否在帖子的编辑中添加更新的行?
  • 另外,当你解决上述问题时,你不想.append([item[2] for item in self.gradehist])绝对不是你想要的...
  • @juanpa.arrivillaga 我只是这样写的,因为这在我包含的累积 gpa 方法中运行良好......我主要是在努力让这个条件子句起作用!

标签: python python-3.x class methods


【解决方案1】:

我不确定这是否是你想要的,但你可以这样尝试:

def semgpa(self, x, y):
    semcred=[]
    semgrad=[]
    for row in self.gradehist:
        if row[3] == x and row[4] == y:
            semcred.append(row[2])
            semgrad.append(row[1])
    return semcred, semgrad

首先,您遍历所有行。然后你只取属于所选学期的行。然后,您可以将这些行中的值附加到新列表中。

【讨论】:

  • 谢谢!我认为这让我更接近......这仍然返回两个空列表,但如果我删除if row[3] == x and row[4] == y: 子句,它会返回所有课程的学分和成绩......这是否意味着只有一个问题我要求 x 和 y 匹配?似乎它认为没有匹配项。
  • @ShaunYoung 这种方法效果很好。它返回([3, 3, 4], [4, 3.3, 3.7])
  • @juanpa.arrivillaga 请原谅我的无知,我在 2009 年春季输入的数据在我的记录中不存在。这行得通,案件已结案。谢谢!
猜你喜欢
  • 2020-06-27
  • 2020-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-13
  • 2013-09-08
  • 2021-09-24
  • 1970-01-01
相关资源
最近更新 更多