Python 每次发生时重复If语句

Python 每次发生时重复If语句,python,python-3.x,list,if-statement,Python,Python 3.x,List,If Statement,我有一个不同课程名称的列表,后面跟一个逗号,然后跟分数 courses = ['COMP 1000,A+', "MATH 1000,A+", 'SCIE1000,B+"] 每次在列表中出现成绩时,我都会将其更改为成绩分值,并将其添加到不同的列表中。然后,我通过求平均值来计算GPA。我正在为此使用以下代码: if any("A+" in n for n in courses): grades.append(4.30) if any("B+" in n for n in courses):

我有一个不同课程名称的列表,后面跟一个逗号,然后跟分数

courses = ['COMP 1000,A+', "MATH 1000,A+", 'SCIE1000,B+"]
每次在列表中出现成绩时,我都会将其更改为成绩分值,并将其添加到不同的列表中。然后,我通过求平均值来计算GPA。我正在为此使用以下代码:

if any("A+" in n for n in courses):
    grades.append(4.30)
if any("B+" in n for n in courses):
    grades.append(3.30)
这对于每个年级重复一次的课程列表来说效果很好,但是对于上面的课程列表,有两个A+,但是4.30只添加了一次。是否有一种方法可以在每次成绩表中都增加4.30分

谢谢

使用一台电脑怎么样


你走错了路。在课程上循环,在逗号上拆分,并在dict中查找年级到年级点的转换(相当于其他语言中的
case
语句)

或作为列表:

grades = [grade_to_grade_point[c.split(',')[1]] for c in courses]

如果您希望将其放在一行中,可以使用以下命令:

courses=['COMP 1000,A+',“MATH 1000,A+”,“SCIE1000,B+”]
点数={'A+':4.30,'B+':3.30}
分数=[分数的值,分数的值。如果课程中有分数,则课程中的项目()为]
印刷品(等级)
>>> [4.3, 4.3, 3.3]

这里有一些很好的答案,但没有一个能告诉你为什么你现有的不起作用:

问题在于你使用的是什么。
any
函数接受布尔值列表,如果列表中至少有一个值为true,则返回true

>>> any([True, True])
True
>>> any([True, False])
True
>>> any([False, False])
False
无论列表中有多少个
True
s,都只返回一个布尔值,并且if语句只运行一次。因此,即使列表中有两个“A+”,也只执行一个
append

最接近您试图用
任何
函数(我能想到)实现的目标是列表理解,条件是:

>>> courses = ['COMP 1000,A+', 'MATH 1000,A+', 'SCIE1000,B+']
>>> [n for n in courses if "A+" in n]
['COMP 1000,A+', 'MATH 1000,A+']
在这里,如果新数组不满足条件,则不属于n
中的“A+”项。这将使您的代码如下所示:

for i in [n for n in courses if "A+" in n]:
    grades.append(4.30)
尽管如此,我不建议这样做。还有其他更干净、更具可读性的解决方案,例如,甚至像这样简单的解决方案:

courses = ["COMP 1000,A+", "MATH 1000,A+", "SCIE1000,B+"]
grades= []
for course in courses:
    if "A+" in course:
       grades.append("4.30")
...
奖金专业提示 BIO,A+< /代码>。它将通过if语句<代码>如果课程中出现“B”
。将课程名称和等级分开可能是值得的

 >>> "Bio,A+".split(",")
 ['Bio', 'A+']
 >>> "Bio,A+".split(",")[1]
 'A+'

)()快乐编码

现有的答案很好,但我想展示一种更面向对象的方法,以备启发。就我个人而言,我更喜欢函数式风格,但OO是目前所教授的主要内容

from decimal import decimal#用于精确小数而不是浮点数学
班级课程:
定义初始(自我、姓名、字母等级):
self.name=名称
self.lettergrade=lettergrade
@类方法
来自_字符串的def(cls,s):
名称,lettergrade=s.split(',')
返回cls(name.strip(),lettergrade.strip())
@财产
def爬坡点(自):
映射={
“A+”:十进制('4.3'),
“A”:十进制('4'),
“A-”:十进制('3.7'),
“B+”:十进制('3.3'),
“B”:十进制('3'),
等等
}
返回映射.get(self.lettergrade)
#将输入读入“课程”,然后:
课程=[Course.from_字符串(c)表示课程中的c]
成绩=[c.课程中c的成绩点]
从统计数据看进口意味着什么
平均分数=平均分数#给出一个等于你平均分数的小数点
courses = ["COMP 1000,A+", "MATH 1000,A+", "SCIE1000,B+"]
grades= []
for course in courses:
    if "A+" in course:
       grades.append("4.30")
...
 >>> "Bio,A+".split(",")
 ['Bio', 'A+']
 >>> "Bio,A+".split(",")[1]
 'A+'