2012-03-15 86 views
19

我有一個列表,其中包含學生的標記數量。將數字轉換爲python列表中的成績

s = [50,62,15,76,57,97,82,99,45,23] 

我想年級學生根據標記:

<40 - Fail 
>50 - A Grade 
>75 - A++ Grade 

我可以迭代做到這一點環路或者我可以使用lambda找到每一個列表。 例如:

>>> filter(lambda x:x>=50, s) 
[50, 62, 76, 57, 97, 82, 99] 

但是,在過濾器中,我只能與一個函數在一個時間工作(例如:馬克大於50)。有沒有辦法可以使用過濾器和lambda並在一行中獲得所需的結果?期待輸出爲帶有等級的標記。 (例如:50-A,62-A,76 -A ++ ...)

回答

21

定義一個函數,它接受一個標記,並返回一個人類可讀表示,你可以使用larsmans's expression或者這一個:

def grade(i): 
    if i<40: return "Fail" 
    if i>75: return "A++" 
    if i>50: return "A" 

使用的String.Format來格式化每個條目,並映射到遍歷所有的人:

li = map(lambda x: "{0} - {1}".format(x, grade(x)), s) 

結果列表中就包含了所需的格式字符串。

for i in li: print i 

# output 

50 - None 
62 - A 
15 - Fail 
76 - A++ 
57 - A 
97 - A++ 
82 - A++ 
99 - A++ 
45 - None 
23 - Fail 
+0

{0}和{1 }工作? – Josh 2013-05-26 02:47:14

+0

@Josh http://docs.python.org/2/library/stdtypes.html#str.format – Anentropic 2013-08-20 10:57:58

15

忘記lambda,忘記filter;假設在A和「失敗」之間存在B等級,則在一個表達式中進行分級。

["fail" if g < 40 else "B" if g < 60 else "A" if g < 75 else "A++" for g in s] 

可以zip這與s結果獲得商標和牌號一個列表。

+0

或者您可以使用地圖,'圖(拉姆達X:(X「 F'如果x <40否則'A ++'如果x> 70否則'A'),s)'。如果你只想要成績,或者只是失去'(x,'(和')')。列表已訂購,因此您可以稍後進行匹配。 – rplnt 2012-03-15 11:01:02

+0

你的理解是78個字符。你可以免費獲得換行符。我知道它違背了Google的Python風格規則,但我更喜歡將它們分成多行,可能在每個'else'的末尾。 – Droogans 2012-08-31 23:37:27

+0

@Droogans:我不知道Google的風格規則,但是在一個實際的程序中,我確實會把一些linebreaks放進去。http://stackoverflow.com/a/5809080/166749 – 2012-09-01 10:54:30

1

你可以寫你自己的過濾器類功能:

def filter_n(n, f, lst): 
    result = tuple([[] for i in range(n)]) 
    for elem in lst: 
     result[f(elem)].append(elem) 
    return result 

答案目前正在尋找如下:

grades = filter_n(3, lambda x: (x < 40) * 0 + 
           (60 < x <= 75) * 1 + 
           (75 < x) * 2, s) 
2
s = [50,62,15,76,57,97,82,99,45,23] 
x = dict([(a, 'A++' if a>75 else 'A' if a>55 else 'F') for a in s]) 

print x 

{97: 'A++', 45: 'F', 99: 'A++', 76: 'A++', 82: 'A++', 15: 'F', 50: 'F', 23: 'F', 57: 'A', 62: 'A'} 

使用x.items()做的過濾器,例如

filter(lambda x: x[1] == 'A', x.items()) 

結果是

[(57, 'A'), (62, 'A')] 
+0

2個作用域,其中'x'名稱是不同的。與其他答案沒有什麼不同,所以如果您擁有編輯權限,編輯可能比答案更合適。 – 2012-09-29 10:19:13

相關問題