6

假设我有:

student_tuples = [ ('john', 'A', 15),
                   ('peter', 'B', 12),
                   ('dave', 'C', 12)]

我如何排序它是这样的:

student_tuples = [('john', 'A', 15), ('dave', 'C', 12), ('peter', 'B', 12)]

我能想到的是:

from operator import itemgetter

sorted(student_tuples, key=itemgetter(2,0), reverse=True)

但随后输出将是:

student_tuples = [('john', 'A', 15), ('peter', 'B', 12), ('dave', 'C', 12)]

这不是我想要的。我如何使用 itemgetter 或任何其他更简单的方法来做到这一点?

4

4 回答 4

11

这样做:

print sorted(student_tuples, key=lambda t: (-t[2], t[0]))
# [('john', 'A', 15), ('dave', 'C', 12), ('peter', 'B', 12)]
于 2013-05-14T07:46:56.843 回答
5

编写自己的密钥获取函数。

student_tuples = [ ('john', 'A', 15), ('peter', 'B', 12), ('dave', 'C', 12)]

def student_key(args):
    name, letter, number = args
    return (-number, name)

>>> sorted(student_tuples, key=student_key)
[('john', 'A', 15), ('dave', 'C', 12), ('peter', 'B', 12)]
于 2013-05-14T07:47:36.667 回答
4

如果您没有可以轻松否定的数字字段,那么您始终可以进行两阶段排序,这取决于 Python.sort稳定的事实:

student_tuples.sort(key=itemgetter(0))
student_tuples.sort(key=itemgetter(2), reverse=True)
于 2013-05-14T07:51:52.130 回答
2

嵌套排序。最外层排序中最重要/第一优先级排序。

student_tuples = [ ('john', 'A', 15),
                   ('peter', 'B', 12),
                   ('dave', 'C', 12)]

from operator import itemgetter

sorted_ = sorted(sorted(student_tuples,key = itemgetter(0)), key=itemgetter(2), reverse=True)

>>> sorted_
[('john', 'A', 15), ('dave', 'C', 12), ('peter', 'B', 12)]
于 2013-05-14T10:51:50.607 回答