[英]How do I get the result in the grades list in 4 seperate lists for each class like the marks list
我如何在每個班級的 4 個單獨列表中的成績列表中獲得結果,例如標記列表:
marks = [[87, 91, 48, 53, 65, 79, 57, 85, 94, 82], # marks of class A
[61, 73, 37, 85, 45, 85, 92, 18, 18, 89], # marks of class B
[87, 94, 35, 65, 84, 64, 25, 61, 46, 28], # marks of class C
[56, 19, 55, 77, 52, 84, 47, 32, 88, 68], # marks of class D
[75, 95, 58, 52, 65, 77, 65, 62, 91, 45]] # marks of class E
# Write your code here to complete the challenges given
grades = []
for i in marks:
for j in range(len(i)):
i[j]+=5
for k in i:
if k <25:
t = 'F'
elif k<=40 :
t = 'E'
elif k<=60 :
t = 'D'
elif k<=75 :
t = 'C'
elif k<90 :
t = 'B'
else:
t = 'A'
grades.append(t)
print(marks)
print(grades)
我試圖根據每個班級單獨列表中的分數來獲取每個學生的成績,但結果中沒有列表分離。 請說明如何用最少的代碼行獲得所需的結果。 另外,有什么方法可以避免在這么多不同的行上編寫所有 if、elif 和 else 語句。 如果 k < 25, k<=40, k<=40... 我們可以做類似的事情嗎: t = 'F','E','D'...
創建一個控制結構(在本例中為 2 元組列表)然后它是一些嵌套循環的情況,如下所示:
from functools import cache
marks = [[87, 91, 48, 53, 65, 79, 57, 85, 94, 82], # marks of class A
[61, 73, 37, 85, 45, 85, 92, 18, 18, 89], # marks of class B
[87, 94, 35, 65, 84, 64, 25, 61, 46, 28], # marks of class C
[56, 19, 55, 77, 52, 84, 47, 32, 88, 68], # marks of class D
[75, 95, 58, 52, 65, 77, 65, 62, 91, 45]]
params = [
(24, 'F'),
(40, 'E'),
(60, 'D'),
(75, 'C'),
(89, 'B')
]
@cache
def get_grade(mark):
for s, m in params:
if mark <= s:
return m
return 'A'
grades = [[get_grade(mark) for mark in clazz] for clazz in marks]
print(grades)
輸出:
[['B', 'A', 'D', 'D', 'C', 'B', 'D', 'B', 'A', 'B'], ['C', 'C', 'E', 'B', 'D', 'B', 'A', 'F', 'F', 'B'], ['B', 'A', 'E', 'C', 'B', 'C', 'E', 'C', 'D', 'E'], ['D', 'F', 'D', 'B', 'D', 'B', 'D', 'E', 'B', 'C'], ['C', 'A', 'D', 'D', 'C', 'B', 'C', 'C', 'A', 'D']]
你的代碼很好。 有一些方法可以減少if
/ elif
的數量,但它們會降低代碼的可讀性。 當您開始處理每個班級時,您應該只重置grades
。 進行以下更改:
for i in marks:
grades = []
...
grades.append(t)
print(grades)
然后它應該打印:
['A', 'A', 'D', 'D', 'C', 'B', 'C', 'A', 'A', 'B']
['C', 'B', 'D', 'A', 'D', 'A', 'A', 'F', 'F', 'A']
['A', 'A', 'E', 'C', 'B', 'C', 'E', 'C', 'D', 'E']
['C', 'F', 'D', 'B', 'D', 'B', 'D', 'E', 'A', 'C']
['B', 'A', 'C', 'D', 'C', 'B', 'C', 'C', 'A', 'D']
我建議將標記到成績的轉換作為一個函數。 然后,您可以在嵌套的列表理解中調用該函數,同樣為每個標記添加+5
:
def to_grade(mark):
if mark < 25:
return 'F'
elif mark <= 40 :
return 'E'
elif mark <= 60 :
return 'D'
elif mark <= 75 :
return 'C'
elif mark < 90 :
return 'B'
else:
return 'A'
marks = [[mark + 5 for mark in group] for group in marks]
grades = [[to_grade(mark) for mark in group] for group in marks]
如果你想減少if/elif
語句的數量,你可以使用標記/等級對的列表或字典。 請注意,您在某些比較中使用<
而在其他比較中使用<=
,因此您必須相應地抵消它們。 (使用dict
時,按順序迭代 dict 很重要,所有較新版本的 Python 都是這種情況。)
grade_ranges = {90: 'A', 75.1: 'B', 60.1: 'C', 40.1: 'D', 25: 'E', 0: 'F'}
def to_grade(mark):
return next(g for m, g in grade_ranges.items() if mark >= m)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.