2015-10-06 46 views
-3

及格資格,我需要一個號碼(考試標記)進行分類,並返回一個字符串:與Python集合

A+=10, 10>A>9, 9>B>7, 7>C>5, 5>D 

所以,如果我的印記,是一個「8.5」,它將返回「B」。

問題是我必須使用一個集合來解決這個問題,因爲我是一個Python新手,我不知道我應該使用什麼類型的集合。

+3

提示:look up * bisection *。 –

+0

8.5不是B嗎? – chepner

+0

該死的,你是對的chepner! – Panoremux

回答

1

我不知道任何適合這種類型的連續範圍檢查的收集/容器。我會用一個if聲明:

def letter_grade(mark): 
    if mark >= 10: 
     return "A+" 
    elif 9 < mark < 10: 
     return "A" 
    elif 7 < mark <= 9: 
     return "B" 
    elif 5 < mark <= 7: 
     return "C" 
    else: 
     return "D" 

如果你知道mark是一個離散值(比如,0至10之間的整數),一本字典是正確的:

# Something like these. A list can already be indexed by integers, 
# or you can create a dictionary that is also indexed by integers. 
>>> marks_list = ["D", "D", "D", "D", "D", "C", "C", "B", "B", "A", "A+"] 
>>> marks_dict = dict(enumerate(marks_list)) 
>>> marks[9] 
'A' 
+0

Ty爲您的迴應,是C和D顛倒,我的錯:(因爲我需要使用收集/容器來解決這個問題,將浮點數更改爲整數然後爲其分配一個標記是正確的嗎? – Panoremux

+0

您可以但是,你可以做的是將邊界存儲在字典中,但這對於容器來說是非常人爲的用法,你仍然需要一個像上面那樣的if語句來檢查每個鍵的標記例如,在字典中。 – chepner

+0

好的,謝謝你的幫助,我真的很感激!:D – Panoremux

0

我想OP想要一個使用容器而不是包含控制結構的函數驅動的解決方案(如if)。 @Martijn彼得斯添加了一個很好的評論,因爲它似乎被忽視的第一篇文章。 bisect是關鍵。

首先,你需要創建的斷點列表:

breakpoints = [6, 7, 8, 9] 

這表明了字母等級(分別爲d,C,B和A)最小值。 'F'是一個特殊情況,因爲它填充的值小於60,因此作爲第一個元素添加到等級信函列表中。你所做的等級字母列表如下:

grades = ['F', 'D', 'C', 'B', 'A'] 

最後,您使用bisect獲得至少score的最接近的最低值的索引,並將其作爲該指數爲等級:

score = 8.5 
print grades[bisect(breakpoints, score)] # outputs 'B' 

總之,這裏是結合的編碼塊與進口:

import bisect 

breakpoints = [6, 7, 8, 9] 
grades = ['F', 'D', 'C', 'B', 'A'] 
score = 8.5 
print grades[bisect.bisect(breakpoints, score)] # outputs 'B' 

有沒有必要讓自己的功能,當你有w若要創建此已經有了內置的方法。