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

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

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 Solutions collect form web for “Как я могу сортировать кортежи с помощью обратного, но разрыв связей не обратный? (Python)”

Самый простой способ добиться того, что вы хотите, – это использовать тот факт, что сортировка 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 вам придется написать более сложную key функцию. Что-то вроде:

 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 принимает необязательный параметр key .

key указывает функцию одного аргумента, которая используется для извлечения ключа сравнения из каждого элемента списка

Вам нужно преобразовать строку в число:

 >>> results = [('10', 'Mary'), ('9', 'John'), ('10', 'George'), ('9', 'Frank'), ('9', 'Adam')] >>> results.sort(key=lambda x: (int(x[0]), x[1]), reverse=True) >>> results [('10', 'Mary'), ('10', 'George'), ('9', 'John'), ('9', 'Frank'), ('9', 'Adam')] 

Просто использование sorted должно быть достаточным

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

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

Вы можете иметь очень подробный контроль над тем, как сортировать каждое из значений в кортеже с key параметром метода sort . Например:

 In [41]: results = [('10', 'Mary'), ('9', 'John'), ('10', 'George'), ('9', 'Frank'), ('9', 'Adam')] In [42]: results.sort(key=lambda (score, name): (-int(score), name)) In [43]: results Out[43]: [('10', 'George'), ('10', 'Mary'), ('9', 'Adam'), ('9', 'Frank'), ('9', 'John')] 
Python - лучший язык программирования в мире.