2014-11-20 55 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]存在,返回,否则返回ÿ本身”。