簡體   English   中英

我如何在每個班級的 4 個單獨列表中的成績列表中獲得結果,如標記列表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM