在单行代码

时间:2016-11-13 00:50:14

标签: python

所以我有以下列表代表学生及其成绩:

a = [('Tim Jones', 58), ('Anna Smith', 64), ('Barry Thomas', 80), ('Tim Smith', 80), ('Yulia Smith', 66)] 

我需要定义一个函数,按照降序排列学生,然后是姓氏,最后是他们的姓氏。使用以下代码行,一切正常:

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

但是现在我还需要确保它与作为字符串而不是整数的成绩一起使用,并且上述函数未通过测试。我认为" - "导致问题,所以我尝试了:

return (sorted(a, key=lambda x: (x[1], x[0]), reverse=True))

但是它反转整个列表并且它没有按预期工作,即使它通过了字符串测试。

我认为我需要做的是检查等级是否为整数,如果是 - 执行代码的第一个版本,如果不是 - 执行其他的东西,我仍然无法理解。< / p>

任何人都有任何想法?

2 个答案:

答案 0 :(得分:5)

你非常接近,但是你需要将你的分数变成int,然后你需要拆分你的名字:

>>> sorted(a, key=lambda x: (-int(x[1]), tuple(reversed(x[0].split()))))
[('Tim Smith', 80),
 ('Barry Thomas', 80),
 ('Yulia Smith', 66),
 ('Anna Smith', 64),
 ('Tim Jones', 58)]

答案 1 :(得分:1)

>>> a = [('Tim Jones', '58'), ('Anna Smith', '64'), ('Barry Thomas', '80'), ('Tim Smith', '80'), ('Yulia Smith', '66')]
>>> b = sorted(a, key=lambda x: (-int(x[1]), x[0]))
[('Barry Thomas', '80'), ('Tim Smith', '80'), ('Yulia Smith', '66'), ('Anna Smith', '64'), ('Tim Jones', '58')]

无论成绩是string还是integer ......

,它都有效