Python сортировка списка списков / по возрастанию, а затем по убыванию - PullRequest
38 голосов
/ 12 июля 2011

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

['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, но затем я прибегаю к элементу, чтобы, конечно, он разрушил предыдущий вид.Я не могу сделать комбинированный ключ, так как он должен сначала отсортировать по убыванию, а затем по возрастанию.

TIA, PK

Ответы [ 3 ]

43 голосов
/ 12 июля 2011
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]]
37 голосов
/ 12 июля 2011

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

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]]
2 голосов
/ 12 июля 2011

Что-то вроде

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 () может быть сведено на нет, чтобы реализовать другое поведение сортировки.

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