Есть ли способ сортировки списка из двух элементов по обоим элементам, но один из элементов отсортирован в обратном порядке? - PullRequest
0 голосов
/ 29 января 2020

Я хочу отсортировать список кортежей (кортежи имеют формат (целое число, строка)) так, чтобы они упорядочивались от наибольшего к наименьшему целому, а затем строки сортировались в алфавитном порядке без потери целочисленного порядка.

### Inputs: data = [(86, 'william'), (74, 'olivia'), (86, 'willaim'), (62, 'lyli'), (74, 'olivai'), (62, 'lily')]
### Outputs: data = [(86, 'willaim'), (86, 'william'), (74, 'olivai'), (74, 'olivia'), (62, 'lily'), (62, 'lyli')]
### What I know how to do: I know how to sort the tuples by specific element from greatest to least
import operator
data.sort(key = operator.itemgetter(0), reverse = True)
### This returns:
### data = [(86, 'william'), (86, 'willaim'), (74, 'olivia'), (74, 'olivai'), (62, 'lily'), (62, 'lyli')]
### At this point I'm not sure how to keep the integers ordered while sorting the strings alphabetically

Ответы [ 2 ]

2 голосов
/ 29 января 2020
data.sort(key=lambda x: (-x[0], x[1]))

Если ваш ключ является кортежем, алгоритм сортировки будет определять приоритет сортировки по первому элементу кортежа, затем второму и т. Д.

1 голос
/ 29 января 2020

Python s sort стабильно :

Метод sort() гарантированно стабилен. Сортировка является стабильной, если она гарантирует отсутствие изменения относительного порядка элементов, которые сравниваются равными - это полезно для сортировки за несколько проходов (например, сортировка по отделу, затем по уровню зарплаты).

Таким образом, вы можете сортировать по строкам сначала , а затем по целым числам. Это оставляет целые числа в порядке убывания, но любые элементы с одинаковым целым числом останутся в том же относительном порядке, что и при сортировке по строкам.

from operator import itemgetter

data.sort(key=itemgetter(1))
data.sort(key=itemgetter(0), reverse=True)

Это не так эффективно, как ответ Михаила Генкина, но это ближе к тому, что вы пытались сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...