Подтвердить что ты не робот

Python сортирует список списков/по возрастанию, а затем расширяет

если у меня есть список, содержащий список, который выглядит так:

['a',1] ['a',2] ['a',3] ['b',1] ['b',2] ['b',3]

как я могу отсортировать их так, чтобы элемент 0 отсортировался по убыванию, а элемент 1 отсортирован по возрастанию, поэтому результат будет выглядеть как...

['b',1] ['b',2] ['b',3] ['a',1] ['a',2] ['a',3]

Используя itemgetter, я могу перейти в обратном направлении к элементу 0, но затем я прибегаю к элементу, чтобы он, разумеется, разрушил предыдущий вид. Я не могу сделать комбинированный ключ, так как он должен сначала сортировать нисходящий, а затем восходящий.

ТИА, ПК

4b9b3361

Ответ 1

L = [['a',1], ['a',2], ['a',3], ['b',1], ['b',2], ['b',3]]
L.sort(key=lambda k: (k[0], -k[1]), reverse=True)

L теперь содержит:

[['b', 1], ['b', 2], ['b', 3], ['a', 1], ['a', 2], ['a', 3]]

Ответ 2

Вы можете делать последовательные раунды сортировки, поскольку python sort - stable. Вы должны сначала отсортировать по второстепенному ключу. См. Также официальный КАК > .

from operator import itemgetter
l = [['a',2], ['a',1], ['b', 2], ['a',3], ['b',1], ['b',3]]
l.sort(key=itemgetter(1))
l.sort(key=itemgetter(0), reverse=True)
# [['b', 1], ['b', 2], ['b', 3], ['a', 1], ['a', 2], ['a', 3]]

Ответ 3

Что-то вроде

def mycmp(a, b):

  res = cmp(a[0], b[0])
  if res == 0:
     return cmp(a[1], b[1])
  return res

newlist = sorted(input_list, cmp=mycmp)

Сначала метод сравнения проверяет первый элемент каждого элемента. Если они равны, они будут проверять второй элемент каждого элемента. Возвращаемое значение внутри реализации mycmp() может быть отменено, чтобы реализовать другое поведение сортировки.