Как я могу сортировать Кортежи по обратному, но разрывать связи не наоборот? (Питон)

Если у меня есть список кортежей:

results = [('10', 'Mary'), ('9', 'John'), ('10', 'George'), ('9', 'Frank'), ('9', 'Adam')]

как я могу сортировать список, как вы можете видеть на табло-так, что он будет сортировать счет от самого большого до самого маленького, но разрывать связи в алфавитном порядке по имени?

Итак, после сортировки, список должен выглядеть так:

results = [('10', 'George'), ('10', 'Mary'), ('9', 'Adam'), ('9', 'Frank'), ('9', 'John')]

на данный момент все, что я могу сделать, это results.sort(reverse=True), но разрывает связи в обратном алфавитном порядке...

любая помощь была бы очень признательна. Спасибо!

4 ответов


самый простой способ достичь того, что вы хотите, - использовать тот факт, что сортировка python стабильна. Это позволяет сначала сортировать по алфавиту, а затем по баллам:

In [11]: results = [(10, 'Mary'), (9, 'John'), (10, 'George'), (9, 'Frank'), (9, 'Adam')]

In [12]: results.sort(key=lambda x: x[1])

In [13]: results.sort(key=lambda x: x[0], reverse=True)

In [14]: results
Out[14]: [(10, 'George'), (10, 'Mary'), (9, 'Adam'), (9, 'Frank'), (9, 'John')]

первая сортировка сортируется в алфавитном порядке, в порядке возрастания. Второй сорт сортирует по баллам, в порядке убывания, поддерживая относительный порядок элементов с равным счетом.

вы можете сделать это, чтобы сделать еще более сложных видов. Просто помните, что вы должны сначала сортировать по среднее ключ, а потом первым ключом. (Если у вас есть три ключа, сначала сортируйте по третьему, затем по второму и, наконец, по главному ключу).

если вы не хотите называть sort дважды вам придется написать более сложный . Что-то вроде:

In [50]: def key(elem):
    ...:     return elem[0], [-ord(c) for c in elem[1]]

In [51]: sorted(results, key=key, reverse=True)
Out[51]: [(10, 'George'), (10, 'Mary'), (9, 'Adam'), (9, 'Frank'), (9, 'John')]

в частности, каждый раз, когда вы что-то отсортированный в лексикографическом порядке(например, строки, кортежи, списки и т. д.), вы можете инвертировать порядок, изменив знак на все элементы.


sort метод принимает необязательный


просто используя sorted должно хватить

>>> sorted(results)
[('10', 'George'), ('10', 'Mary'), ('9', 'Adam'), ('9', 'Frank'), ('9', 'John')]

по умолчанию cmp функция проверяет приоритет кортежа, сравнивая каждый член Кортежа от 0 до n, в этом порядке


вы можете иметь очень детальный контроль над тем, как сортировать каждое из значений в кортеж с sort методом