32

我有以下类型的列表

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

我想按第二列的降序对它进行排序。我在 python 中尝试了“排序”函数。但是给我'TypeError' : 'float' object is unsubscriptable

4

2 回答 2

60

您可以使用 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]]
于 2013-09-02T00:54:07.407 回答
20

要对第二列中的列表进行排序,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()比使用 alambda来完成任务要快一点。

演示:

>>> 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)调用应用于外部列表中的所有元素,但仅适用于嵌套的有序序列,而不适用于现在添加的一个浮点值。

于 2013-09-01T22:50:22.713 回答