Сортировка 2D-списка python

У меня есть следующий тип списка

lst = [
    [1, 0.23],
    [2, 0.39],
    [4, 0.31],
    [5, 0.27],
]

Я хочу отсортировать это в порядке убывания второго столбца. Я попытался "отсортировать" функцию в Python. Но дает мне "TypeError": объект "float" является неподписанным. Пожалуйста, помогите мне решить эту проблему.

Ответ 1

Вы можете использовать lambda:

>>> li=[[1, 0.23],
... [2, 0.39],
... [4, 0.31],
... [5, 0.27]]
>>> sorted(li,key=lambda l:l[1], reverse=True)
[[2, 0.39], [4, 0.31], [5, 0.27], [1, 0.23]]

Или другим способом:

>>> sorted(li,key=lambda l:l[1])
[[1, 0.23], [5, 0.27], [4, 0.31], [2, 0.39]]

Ответ 2

Чтобы отсортировать список списков во втором столбце, используйте operator.itemgetter() для удобства и ясности:

from operator import itemgetter
outputlist = sorted(inputlist, key=itemgetter(1), reverse=True)

или, чтобы отсортировать на месте:

from operator import itemgetter
inputlist.sort(key=itemgetter(1), reverse=True)

itemgetter() немного быстрее, чем использование lambda для задачи.

Демо:

>>> from operator import itemgetter
>>> inputlist = [
...     [1, 0.23],
...     [2, 0.39],
...     [4, 0.31],
...     [5, 0.27],
... ]
>>> sorted(inputlist, key=itemgetter(1), reverse=True)
[[2, 0.39], [4, 0.31], [5, 0.27], [1, 0.23]]

Вы увидите только свое исключение, если бы вы имели значения с плавающей запятой в вашем списке входных данных напрямую:

>>> inputlist.append(4.2)
>>> inputlist
[[1, 0.23], [2, 0.39], [4, 0.31], [5, 0.27], 4.2]
>>> sorted(inputlist, key=itemgetter(1), reverse=True)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'float' object is not subscriptable

(для Python 3, сообщение об ошибке Python 2 несколько отличается, в результате вместо TypeError: 'float' object has no attribute '__getitem__').

Это происходит потому, что вызов itergetter(1) применяется ко всем элементам внешнего списка, но работает только с вложенными упорядоченными последовательностями, а не с одним добавленным значением с плавающей запятой.