Как я могу сортировать кортежи с помощью обратного, но разрыв связей не обратный? (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')] 
Interesting Posts

Печать потерь во время обучения TensorFlow

Сети Python меняют цвет узлов при использовании draw_network_nodes ()

Сравнение символов в строке последовательно в Python

Возврат max для нуля или значения для столбца DataFrame pandas

Не найти ожидаемые строки с пирарированием

Macports выбирает интерпретатор Python по умолчанию для выполнения скриптов?

Автоматически масштабировать ylim и xlim в Matplotlib

Выделите точное местоположение содержимого в html для веб-скрепок urllib2 Beautiful Soup

Назначение переменных среды из сценария bash для текущего сеанса из Python

Найти индексы элементов, равных нулю, из массива numpy

Элементы в случайном порядке и maxOccurs> 1

Как автоматически маркировать кластер слов с помощью семантики?

Создайте граф, который работает с переменным размером партии, используя Tensorflow

PyCharm, что такое python_stubs?

Как получить объект, если он существует, или Нет, если он не существует?

Python - лучший язык программирования в мире.