2014-11-20 53 views
0

我想成績按字母順序是在元組的函數,例如排序:的Python:排序元組串字母

sortGrades([('John Smith', 'C'), ('Adam Thomas', 'B'), ('Katie Johnson', 'A')]) 

而且,數字,像這樣:

sortGrades([('John Smith', 54), ('Adam Smith', 54), ('Thomas King', 88)]) 

所以將按照最高分和最高分排序元組。如果有兩個人得分相同,名稱也應按字母順序排序。

到目前爲止,我的功能看起來是這樣的:

def sortGrades(list): 
return sorted(list, key=lambda x:(-x[1],x[0])) 

然而,這似乎並沒有當我有點等級(A,B,C),它返回一個「類型錯誤的工作:壞數類型爲一元 - :'str'「

任何想法如何使它在同一時間工作的字符串和整數?

  • 編輯問題,需要它爲字符串和整數都工作!
+0

「如何使它適用於字符串」或「如何使它適用於**字符串和整數**」? – 2014-11-20 19:49:25

+0

字符串和整數。我的壞,對不起!我只需要一個功能就可以做到這一切。 – Josh 2014-11-20 19:49:56

+0

必須'sortGrades()'在沒有任何指示的情況下操作,以期望使用哪種類型的列表? – 2014-11-20 19:51:56

回答

0

如果您的所有成績都是單個大寫字母,則可以使用key=lambda x: (-ord(x[1]), x[0]))(按字符的ASCII值排序)。

1

以類似的方式向你寫什麼,我會做這樣的:

return sorted(list, key=lambda x:(tuple(-ord(c) for c in x[1]), x[0])) 

這基本上否定了所有的字符字符串中,所以你仍然可以排序的詞素文字順序。

當然,由於您的案例只有單字符字符串,所以請撥打ord一次。

如果你希望它能夠同時使用字符串和整數,那麼這是一個壞主意。你如何比較'A'54?最好有兩個版本的功能。

0

試試這個,比較一個包含阿爾法等級的列表或包含數字等級的列表是令人滿意的。

def sortedGrades(some_contents): 
    def as_numeric(x): return (-x[1],x[0]) 
    def as_alpha(x): return (-ord(x[1]), x[0]) 

    sort_keys = { type(0): as_numeric, 
    type('A'): as_alpha, 
    } 
    if not some_contents: 
     return some_contents 
    sort_key = sort_keys[type(some_contents[0][1])] 
    return sorted(some_contents, key=sort_key) 
0

一種選擇是使翻譯的註釋到整數一個字典,並從該字典挑值:

a = [('John Smith', 'B'), ('Adam Thomas', 'A'), ('Katie Johnson', 'C')] 
b = [('John Smith', 54), ('Adam Smith', 54), ('Thomas King', 88)] 

def sort_grades(lst): 
    notes = {'C':1, 'B':2, 'A':3} 
    return sorted(lst, key=lambda (x, y): (notes.get(y, y), x)) 

print sort_grades(a) 
print sort_grades(b) 

get(y, y)基本上意味着「如果DICY [Y]存在,返回,否則返回ÿ本身」。