Объясните, как сортируется этот список в 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 шт):
Все достаточно просто - в ключе сортировки используется лямбда функция, которая возвращает кортеж перевернутый задом-наперёд. Т.е. из (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)]
все просто
стоит задача - надо отсортировать список кортежей по возрастанию второго элемента в кортеже
по умолчанию питон сортирует от первого элемента кортежа к последнему, но нам требуется наоборот, поэтому мы разворачиваем кортежи и дальше питон сортирует как обычно
т.е.
[(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])))
