【问题标题】:Using lists to calculate grades Python 3, help simplifying code使用列表计算成绩 Python 3,帮助简化代码
【发布时间】:2021-02-13 20:42:31
【问题描述】:

我需要关于我的家庭作业的帮助/意见。我已经有一个可以工作的代码,但我想知道是否有更简单的方法来编写代码以缩短代码长度。

以下是作业的参考方向:

有十个名字和五个考试成绩列表。对应 名字和考试成绩之间是由职位决定的。例如,Cindy 的考试成绩为 67、92、67、43、78。去掉每个学生五个考试成绩中最低的一个,然后取其余的平均值,然后确定该学生的字母等级。确保您的打印输出与我的打印输出相同,列宽相同。

这是我的代码:

names = ['April','Bill','Cindy','Dave','Emily',  'Frank','Gene','Hank','Irene','Jeff']
test1 = [34,21,67,45,88,  77,63,96,89,88]
test2 = [11,67,92,35,89,  25,78,94,81,63]
test3 = [94,33,67,34,67,  88,55,99,23,43]
test4 = [27,83,43,67,93,  45,67,77,86,90]
test5 = [43,76,78,45,65,  99,65,65,79,43]

total = [0,0,0,0,0,0,0,0,0,0]
min = [0,0,0,0,0,0,0,0,0,0]
percent = [0,0,0,0,0,0,0,0,0,0]
grade = ['F','F','F','F','F','F','F','F','F','F']

for i in range (10):
    total[i] = test1[i]
    min[i] = test1[i]
    
for i in range (10):
    total[i] = total[i] + test2[i]
    total[i] = total[i] + test3[i]
    total[i] = total[i] + test4[i]
    total[i] = total[i] + test5[i]
    min[i] = min[i] if min[i] < test2[i] else test2[i]
    min[i] = min[i] if min[i] < test3[i] else test3[i]
    min[i] = min[i] if min[i] < test4[i] else test4[i]
    min[i] = min[i] if min[i] < test5[i] else test5[i]
    total[i] = total[i] - min[i]
    
for i in range (10):
    percent[i] = total[i]/4.0
    if percent[i] >= 90: grade[i] = 'A'
    elif percent[i] >= 80: grade[i] = 'B'
    elif percent[i] >= 70: grade[i] = 'C'
    elif percent[i] >= 60: grade[i] = 'D'
    elif percent[i] >= 50: grade[i] = 'F'
    print (" %s\t%d %2.2f %s \n" %(names[i], total[i], percent[i], grade[i]))

输出应如下所示:

April   198  49.50 F
Bill    259  64.75 D
Cindy   304  76.00 C
Dave    192  48.00 F
Emily   337  84.25 B
Frank   309  77.25 C
Gene    273  68.25 D
Hank    366  91.50 A
Irene   335  83.75 B
Jeff    284  71.00 C

基本上我只是想知道是否有人有任何想法/方法可供我尝试以简化代码。我只是感到困惑,因为成绩是垂直对应的。无论哪种方式都很好,但我觉得好像可以修改。我还是个初学者,所以我可能不熟悉什么是简单的解决方法:) 谢谢!

【问题讨论】:

  • Have a look here 看看您的问题是否可以成为Code Review 的主题。
  • @khelwood 谢谢。我应该在那里重新发布吗?我没怎么用过 Stack Overflow :)
  • 如果你认为你可以为 codereview 写一个很好的问题,请继续,但请确保你先阅读他们的on-topic 页面。这个问题对于 Stack Overflow 来说可能过于模糊;

标签: python python-3.x list loops for-loop


【解决方案1】:

这是字典而非列表的理想用例。字典允许您为键分配值。在这种情况下,键将是学生姓名和他们的成绩值。例如,

{student_1 : [grade_1, grade_2 ... grade_n],
 ...
 student_n : [grade_1, grade_2 ... grade_n]
}

通过这种方式,将成绩与任何给定学生关联起来会容易得多。

此外,一些非常基本功能定义(例如平均成绩)在这里会很有帮助。这些被证明对于使用 f-string 创建干净的输出非常有用。

总之:查找字典、函数和 f-strings 可以教给您很多有用的技能,以便进一步编码。我在下面提供了一个示例,希望它可以理解。

names = ['April','Bill','Cindy','Dave','Emily', 

'Frank','Gene','Hank','Irene','Jeff']

test1 = [34,21,67,45,88,  77,63,96,89,88]
test2 = [11,67,92,35,89,  25,78,94,81,63]
test3 = [94,33,67,34,67,  88,55,99,23,43]
test4 = [27,83,43,67,93,  45,67,77,86,90]
test5 = [43,76,78,45,65,  99,65,65,79,43]

#Assign every student to the dictionary
#So far their respective grades are an empty list
grades = dict()
for name in names:
    grades[name] = []

#Group all tests in a single list, which is easier to iterate over
tests = [test1, test2, test3, test4, test5]

#Loop over all tests
#Every i-th student gets the i-th value of every test added to the dictionary
for test in tests:
    for i in range(len(test)):
        grades[names[i]].append(test[i])

#Remove the lowest grade and calculate the average afterwards
def avg_grade(grades):
    grades.remove(min(grades))
    return sum(grades) / len(grades)

#Associate a grade with a letter compared to a threshold
def letter(grade):
    thresholds = [90, 80, 70, 60, 50]
    letters = ['A', 'B', 'C', 'D', 'F']
    for i in range(len(thresholds)):
        if grade >= thresholds[i]:
            return letters[i]

#Output as f-string
for name in names:
    print(f'{name:6} {avg_grade(grades[name]):.2f}  '
          f'{letter(avg_grade(grades[name]))}')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多