Ответ 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]]
если у меня есть список, содержащий список, который выглядит так:
['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, но затем я прибегаю к элементу, чтобы он, разумеется, разрушил предыдущий вид. Я не могу сделать комбинированный ключ, так как он должен сначала сортировать нисходящий, а затем восходящий.
ТИА, ПК
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]]
Вы можете делать последовательные раунды сортировки, поскольку 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]]
Что-то вроде
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() может быть отменено, чтобы реализовать другое поведение сортировки.