key должна быть функция, которая определяет, как извлечь сопоставимый элемент из вашей структуры данных. В вашем случае это второй элемент кортежа, к которому мы обращаемся [1].
Для оптимизации смотрите Ответ джамиляка с использованием operator.itemgetter(1), который по сути является более быстрой версией lambda x: x[1].
IMO с использованием itemgetter в этом случае более удобочитаемо, чем решение от @cheeken. Это также быстрее, поскольку почти все вычисления будут выполняться на c стороне (без каламбура), а не с помощью lambda.
>python -m timeit -s "from operator import itemgetter; data = [('abc', 121),('abc', 231),('abc', 148), ('abc',221)]""sorted(data,key=itemgetter(1))" 1000000 loops, best of 3: 1.22 usec per loop
>python -m timeit -s "data = [('abc', 121),('abc', 231),('abc', 148), ('abc',221)]""sorted(data,key=lambda x: x[1])" 1000000 loops, best of 3: 1.4 usec per loop
Ответ 3
Добавляя к ответу Чикена, вот как вы сортируете список кортежей по 2-му элементу в порядке убывания.