Как отсортировать список списков по одному элементу по возрастанию, а другой по убыванию - PullRequest
0 голосов
/ 10 мая 2018

Мне нужно упорядочить списки внутри списка по номерам в порядке убывания. Если число совпадает, я должен заказать его в алфавитном порядке (увеличение).

Например, если у меня есть следующий список:

mylist=[['a', 5], ['l', 2], ['u', 1], ['t', 1], ['q', 1], ['o', 1], ['e', 1]]

Вывод должен быть таким:

[['a', 5], ['l', 2], ['e', 1], ['o', 1], ['q', 1], ['t', 1], ['u', 1]]

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

Ответы [ 3 ]

0 голосов
/ 10 мая 2018

Если я правильно понимаю, вы хотите отсортировать по второму элементу (номеру) по убыванию и по первому элементу (букве) по алфавиту.

Это должно получить то, что вы ищете:

mylist = list=[['a', 5], ['l', 2], ['u', 1], ['t', 1], ['q', 1], ['o', 1], ['e', 1]]
sorted_list = sorted(mylist, key = lambda x:(-x[1], x[0]))
print(sorted_list)
#[['a', 5], ['l', 2], ['e', 1], ['o', 1], ['q', 1], ['t', 1], ['u', 1]]

Мы используем аргумент key для sorted, чтобы определить, как сортировать список. В этом случае мы передаем лямбда-функцию lambda x: (-x[1], x[0]) в качестве ключевой функции. «Хитрость» в том, что мы передаем отрицательное значение x[1] (отрицательное число), чтобы оно сортировалось по убыванию числа. Вторым элементом кортежа x[0] является символ, который будет использоваться для разрыва связей для элементов списка с одинаковым числовым значением.

0 голосов
/ 10 мая 2018

Если вы хотите стать более сложным, вы можете определить класс, который определяет оператор '<' так, как вы хотите.Затем вы можете передать отсортированный список экземпляров вашего нового класса.Или вы используете конструктор класса для генерации ключей. </p>

Для этого простого примера это, кажется, излишне.

class Foo(list):
    def __lt__(self, other):
        return self[1] > other[1] or (self[1] == other[1] and self[0] < other[0])

sorted(l, key=Foo)
0 голосов
/ 10 мая 2018

Вы можете использовать аргумент key только для ключевых слов, чтобы изменить способ list.sort оценивать каждый элемент списка. В этом случае вы хотите, чтобы он оценил второй элемент каждого подсписка, или sublist[1].

# don't use `list` as a variable name, it shadows the builtin
lst.sort(key=lambda sublst: sublst[1])

или используя operator.itemgetter:

from operator import itemgetter

lst.sort(key=itemgetter(1))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...