如何先减少值,然后增加第二个值

时间:2013-05-14 07:43:05

标签: python sorting

我想说:

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 个答案:

答案 0 :(得分:10)

这样做:

print sorted(student_tuples, key=lambda t: (-t[2], t[0]))
# [('john', 'A', 15), ('dave', 'C', 12), ('peter', 'B', 12)]

答案 1 :(得分: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)]

答案 2 :(得分:3)

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

student_tuples.sort(key=itemgetter(0))
student_tuples.sort(key=itemgetter(2), reverse=True)

答案 3 :(得分: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)]