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

Ale*_*lis 6 python sorting

我想说:

student_tuples = [ ('john', 'A', 15),
                   ('peter', 'B', 12),
                   ('dave', 'C', 12)]
Run Code Online (Sandbox Code Playgroud)

我如何将它排序为这样:

student_tuples = [('john', 'A', 15), ('dave', 'C', 12), ('peter', 'B', 12)]
Run Code Online (Sandbox Code Playgroud)

我能想到的是:

from operator import itemgetter

sorted(student_tuples, key=itemgetter(2,0), reverse=True)
Run Code Online (Sandbox Code Playgroud)

但是输出将是:

student_tuples = [('john', 'A', 15), ('peter', 'B', 12), ('dave', 'C', 12)]
Run Code Online (Sandbox Code Playgroud)

那不是我想要的.我怎样才能使用itemgetter或其他更简单的方法呢?

Ric*_*dle 10

这样做:

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

  • 分两次排序是更好的方法。否定键方法仅适用于数字键。 (2认同)

Adr*_*ala 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)]
Run Code Online (Sandbox Code Playgroud)