我想在元组中的函数中按字母顺序对成绩进行排序,例如:
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)进行排序时,它似乎不起作用,它返回“TypeError:一元的坏操作数类型 - :'str'”
知道如何让它同时适用于字符串和整数吗?
答案 0 :(得分:1)
以与你所写的类似的方式,我会这样做:
return sorted(list, key=lambda x:(tuple(-ord(c) for c in x[1]), x[0]))
这基本上否定了字符串中的所有字符,因此您仍然可以按字母顺序排序。
当然,由于您的案例只有单字符字符串,因此调用ord
一次就可以了。
如果你想让它同时使用字符串和整数,那么这是一个坏主意。您如何比较'A'
和54
?最好有两个版本的函数。
答案 1 :(得分:0)
如果您的所有成绩都是单个大写字母,则可以使用key=lambda x: (-ord(x[1]), x[0]))
(按字符的ASCII值排序)。
答案 2 :(得分:0)
试试这个,它可以比较包含alpha等级的列表或包含数字等级的列表。
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)
答案 3 :(得分: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]存在,则返回,否则返回y”。