Как я могу сортировать Кортежи по обратному, но разрывать связи не наоборот? (Питон)
Если у меня есть список кортежей:
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')]
в частности, каждый раз, когда вы что-то отсортированный в лексикографическом порядке(например, строки, кортежи, списки и т. д.), вы можете инвертировать порядок, изменив знак на все элементы.
просто используя sorted
должно хватить
>>> sorted(results)
[('10', 'George'), ('10', 'Mary'), ('9', 'Adam'), ('9', 'Frank'), ('9', 'John')]
по умолчанию cmp
функция проверяет приоритет кортежа, сравнивая каждый член Кортежа от 0 до n, в этом порядке
вы можете иметь очень детальный контроль над тем, как сортировать каждое из значений в кортеж с sort
методом