Сортировка 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)
применяется ко всем элементам внешнего списка, но работает только с вложенными упорядоченными последовательностями, а не с одним добавленным значением с плавающей запятой.