我有以下类型的列表
lst = [
[1, 0.23],
[2, 0.39],
[4, 0.31],
[5, 0.27],
]
我想按第二列的降序排序。我尝试使用Python中内置的sorted()
函数,但它给了我一个错误信息:'TypeError' : 'float' object is unsubscriptable
。
我有以下类型的列表
lst = [
[1, 0.23],
[2, 0.39],
[4, 0.31],
[5, 0.27],
]
我想按第二列的降序排序。我尝试使用Python中内置的sorted()
函数,但它给了我一个错误信息:'TypeError' : 'float' object is unsubscriptable
。
>>> 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]]
l
是lambda的参数,在函数体后面用冒号 :
分隔。l[1]
接收传递给lambda的列表,并返回第二个元素(下标 [1]
表示第二个元素...)。 - dawg使用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)
< p > 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'对象没有属性 '__getitem__'
)。
这是因为itergetter(1)
被应用于外部列表中的所有元素,但仅适用于嵌套有序序列,而不能用于现在添加的浮点值。