根据用户输入的数据尝试制作3个列?

时间:2016-02-23 05:15:43

标签: python python-3.x

我会尽可能详细地解释这一点,以防止任何混淆,我很抱歉提前解决了我的糟糕代码术语。

我的目标是获取用户设置的数据,数字范围从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)

我知道我已经有相当多的注释,我无法使百分比计算工作,我理解这需要很多工作,因为它在起草阶段。我非常感谢您的任何意见,谢谢。

`

1 个答案:

答案 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))

每次进行彻底清单都会为您提供一切。

看起来你的输入很好,所以剩下要做的就是让输出看起来很漂亮,你似乎已经得到了足够多的建议。我没理由再添加另一个(可能相互冲突的)意见。

无论如何,我希望这会有所帮助,或者如果我不希望你在此之前很久就有理由忽视我。看到这是战争与和平的堆栈溢出版本,我确定我犯了一个错误,或者在这个烂摊子的某个地方不清楚。我必须达到自己的编程截止日期,但我会留意一两个问题。