Объясните, как сортируется этот список в Python

решил порешать задачки с инета, да бы закрепить знания, прежде чем перейти к след главе читаемой книги

И наткнулся где-то в комментах на такой код

l = [(1, 2), (4, 5), (100, 1)]
print(sorted(l, key=lambda x: x[::-1]))

изучил параметр key, изучил досконально саму функцию sorted, так же знаю про срезы и lambda, т.е знаю все что есть в этом коде. Вроде как понимаю, что он сортирует их по второму элементу(это и является для меня проблемой, так как не понимаю, как он получает инфу про 2 элемент), НО

lambda x: x[::-1]

просто возвращает перевернутый список, как это помогает функции sorted()отсортировать список по второму элементу из кортежа, как она получает его значение

такой код я понимаю

a = ['abc','a','ab']
print(sorted(a, key = len))

он берет длину строк и использует их для сортировки, а дальше sorted() по своей специфики сортирует от меньшего к больше, А ТО НЕТ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! HELP!!!!!!!!!!!!! желательно подробно и разжеванной =3


Ответы (2 шт):

Автор решения: MaxU

Все достаточно просто - в ключе сортировки используется лямбда функция, которая возвращает кортеж перевернутый задом-наперёд. Т.е. из (1, 2) получается (2, 1), (4, 5) -> (5, 4), (100, 1) -> (1, 100).

In [162]: [x[::-1] for x in l]
Out[162]: [(2, 1), (5, 4), (1, 100)]
→ Ссылка
Автор решения: Zhihar

все просто

введите сюда описание изображения

стоит задача - надо отсортировать список кортежей по возрастанию второго элемента в кортеже

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

т.е.

[(1, 2), (4, 5), (100, 1)]

превращаем в

[(2, 1), (5, 4), (1, 100)]

что при сортировке даст

[(1, 100), (2, 1), (5, 4)]

Но поскольку сортируется именно наш список, то получаем

[(100, 1), (1, 2), (4, 5)]

С тем же успехом можно было бы написать:

print(sorted(l, key=lambda x: x[-1]))

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

l = [(1, 2), (4, 5), (100, 1), (99, 1)]

дал бы

[(100, 1), (99, 1), (1, 2), (4, 5)]

а не

[(99, 1), (100, 1), (1, 2), (4, 5)]

а при переворачивании кортежей получаем сортировку не по одному элементу, а по всем элементам кортежа (т.е. когда первые элементы двух кортежей одинаковы, то смотрим вторые элементы и уже на основании их решаем какой кортеж левее, а какой правее)

P.S.

к сожалению в python3 нет нормальной сортировки, которую можно задать через функцию сравнения двух объектов, например

sorted(arr, lambda obj1, obj2: obj1 < obj2)

поэтому приходится извращаться

Например, если бы было требование отсортировать список кортежей так, чтобы второй элемент возрастал, а первый убывал, то пришлось бы написать вот такой код:

l = [(1, 2), (4, 5), (100, 1), (99, 1)]
print(sorted(l, key=lambda x: (x[1], -x[0])))
→ Ссылка