我会尽可能详细地解释这一点,以防止任何混淆,我很抱歉提前解决了我的糟糕代码术语。
我的目标是获取用户设置的数据,数字范围从0到100.这些数字将在功能" Rank" 。然后,通过等级系统和输入,分数将被排序并在等级中分布以适合每个参数:`
(**A** >= 91, **B** >=81 and score <=90, **C** >=71 and score <=80,
**D** >=61 and score <=70, and **F** <=60)
这被标记为&#34; Count&#34; 例如,如果碰巧有89,85和61,那么它们将被计为2 B&#39; s和1 D.最后,有&#34;百分比&#34; 然后使用计数,并将它们分类为每个等级中得分数的百分比。因此,对于前面的示例,B的百分比为66%,D级的百分比为33%。我试图让我的代码像这样执行给用户:`
>>>GRADE COUNT PERCENTAGE
>>>A 0 0%
>>>B 2 66%
>>>C 0 0%
>>>D 1 33%
>>>F 0 0%
到目前为止,我在代码中的内容是:
def grade_scores(scoreList):
count = int(input('Enter amount of scores: '))
print('Each will be entered one per line')
scoreList = []
for i in range(1, count+1):
scoreList.append(int(input('Enter score: ')))
for score in range(len(scoreList)):
if score >= 91:
Ascore = 'A'
count[0] += 1 # Increase index 0 (Corresponds to value A) by 1
#sum(Ascore) / Acount (scoreList) = Apercentage
elif score >= 81 and score <=90:
Bscore = 'B'
count[1] += 1
#sum(Bscore) / Bcount (scoreList) = Bpercentage
elif score >= 71 and score <=80:
Cscore = 'C'
count[2] += 1
#sum(Cscore) / Ccount (scoreList) = Cpercentage
elif score >= 61 and score <=70:
Dscore = 'D'
count[3] += 1
#sum(Dscore) / Dcount (scoreList) = Dpercentage
else:
Fscore = 'F'
count[4] += 1
#sum(Dscore) / Dcount (scoreList) = Dpercentage
print("SCORE COUNT PERCENTAGE")
for i in range(len(grade)):
print(" {} {} {} %".format(grade[i], count[i], percentage[i]))
scores = get_scores()
grade_scores(scores)
我知道我已经有相当多的注释,我无法使百分比计算工作,我理解这需要很多工作,因为它在起草阶段。我非常感谢您的任何意见,谢谢。
`
答案 0 :(得分:0)
编辑:这整篇文章的编写假设这不是你的第一个程序。关于这个花了14个小时的评论是基于我的猜测,这是编程课2个月的任务。功能,四个?不同的数据类型,类型转换,列表操作,输出格式......这对于第一个程序来说是雄心勃勃的。我不会删除它,因为你可能会觉得它很有趣,但要知道这里绝对没有必要。
根据您的其他问题,您至少已经在这里工作了14个小时,所以我会尝试展示一种不同的做法,这样做会更有意义或者让人感到困惑。您。如果事实证明是后者,那就忽略我继续前进吧。这只是一种完全不同的思考问题的方式,可能对您有所帮助。它没有比你做的更好或更糟。
值得一提的是,如果这是针对编程类的,那么您可能无法使用它。如果教师/教授试图教你if / elif / else语句,他们不会对不使用它们的代码感到满意,无论它是否得到正确的结果。
(编辑:刚刚看到你的评论,你正在教你自己编程作为你的第一个程序。太棒了!在这种情况下,我强烈建议继续掌握基础知识(如果,其他,for,while等。 ),但这可以给你一些巧妙的技巧,如果你没有别的话,你可以将我的大多数例子直接扔进一个程序或python shell中。如果你想自己试一试。)
值得一提的是,我(遗憾地)是一名律师。我们没有tl / dr的概念。遗憾。
以下是代码:
def grade_scores(scoreList):
grades = 'ABCDF'
print('Grade, Count, Percentage')
for i in range(0,5):
gradeCount = sum([score <+ 100 - 10 * i and (score >= 91 - 10 * i or i == 4) for score in scoreList])
print(grades[letter], gradeCount, gradeCount/(len(scoreList)-1))
好消息是,它的成本较短,每个字母等级只会循环一次,而且方式较少,需要跟踪的变量要少。坏消息是你有一个比文本框宽的庞然大物:
sum([score <= 100 - 10 * i and (score >= 91 - 10 * i or i == 4) for score in scoreList])
我知道它看起来很糟糕,但和我在一起。 sum()部分很简单。就像你期望的那样,它会将数字列表加在一起。
s = [1, 2, 3]
sum(s) equals 6
sum()函数内部是一个名为“&#39; list comprehension”的特殊表达式,通常看起来像
[some expression for i in list]
#I'm awful with variable consistency, so just assume that no variable carries over
#from example to example.
这只是一种奇特的方式,可以对列表的每个元素执行某些操作以形成新列表。
例如:
list = [1, 2, 3]
print([x*2 for x in list])
将打印
[2, 4, 6]
这非常方便,因为对于每个字母等级,我们可以将等级列表转换为易于计算的等级。具体来说,我们会将每个等级变为1或0,具体取决于它是否与相关的字母等级相对应。
我们可以通过利用编程的怪癖来做到这一点。 True和False与1和0相同。
例如:
1 > 2 #equals 0,
f = 8
f = f < 10 #will make f equal 1,
#and
list = [1, 2, 1, 2]
print([g == 2 for g in list]) #outputs [0, 1, 0, 1]
我们的目标是编写一个if语句(减去if),它可以适用于每个字母等级。
如果有这样的陈述,你已经写过:
score >= 71 and score <=80
和此:
score >= 81 and score <=90
当你考虑它时,这些陈述之间唯一真正的区别是10. A&#39; B&#39;小于或等于10 * 9,而C&#39;小于或等于10 * 8,一直到F&#39; F&#39;,10 * 60。
如果从0到4计数,
i * 10 + 60
将为您提供从F到A的每个等级的上限。
我觉得从A开始更容易,所以我只从100减去:
upper = [100 - i * 10 for i in range(0,5)]
#range stops before the last number, so range(0,5) = [0, 1, 2, 3, 4]
[100, 90, 80, 70, 60]
底部限制的工作原理完全相同,只是在9个地方开始。
lower = [91 - i * 10 for i in range(0,5)]
[91, 81, 71, 61, 51]
所以如果A = 0,B = 1等,
score >= 91 - i * 10 and score <= 100 - i * 10
将几乎为每个字母等级提供正确或错误。唯一的问题是讨厌的F&#39;它并没有像所有其他模式一样遵循相同的模式,因为F不会在51处停止。我们需要为它们写一个特例。
根据我们的模式F = 4,所以如果我们将下限改为
(score >= 91 - i * 10 or i == 4)
在我们寻找F的整个时间内,下限将保持为True。
离开我们
(score >= 91 - i * 10 or i == 4) and score <= 100 - i * 10
根据分数是否属于字母等级i的范围而给出真或假的陈述。
从这里开始,我们回到了庞然大物的声明:
i = 2 #Starting with A equals 0, this makes i equal to C
scoreList = [65, 95, 75, 78]
[(score >= 91 - i * 10 or i == 4) and score <= 100 - i * 10 for score in scoreList]
会给我们
[0, 0, 1, 1]
如果我们使用sum语句添加该列表中的每个数字,我们就可以知道列表中有多少C等级。我们现在需要做的就是建立一个从i = 0到i = 4,
的循环for i in range(0,5):
将我们的列表理解结果加起来,并打印出结果。
这将使我们的print()声明变得更加容易,因为现在对变量的处理方式并不多。唯一真正的挑战是印刷这封信(因为我们目前只处理了数字),并获得了一个百分比。
对于这封信,我们只会打包一个包含&#39; ABCDF&#39;的小字符串。您可以在字符串中找到与列表中的条目完全相同的字母。
alpha = 'ABCDF'
alpha[3] = 'D'
要查找百分比,我们现在可以轻松访问每个成绩的计数,我们只需通过使用len()函数查看原始列表的长度即可找到成绩总数。将总数除以数,乘以100,你就得到一个百分比。
print(grades[i], gradeCount, (gradeCount/(len(scoreList)*100))
每次进行彻底清单都会为您提供一切。
看起来你的输入很好,所以剩下要做的就是让输出看起来很漂亮,你似乎已经得到了足够多的建议。我没理由再添加另一个(可能相互冲突的)意见。
无论如何,我希望这会有所帮助,或者如果我不希望你在此之前很久就有理由忽视我。看到这是战争与和平的堆栈溢出版本,我确定我犯了一个错误,或者在这个烂摊子的某个地方不清楚。我必须达到自己的编程截止日期,但我会留意一两个问题。