Python:按字母顺序排序元组字符串

时间:2014-11-20 19:43:07

标签: python sorting

我想在元组中的函数中按字母顺序对成绩进行排序,例如:

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'”

知道如何让它同时适用于字符串和整数吗?

  • 编辑过的问题,需要它才能用于字符串和整数!

4 个答案:

答案 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”。