如何对一个二维列表进行排序?

37

我有以下类型的列表

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

我想按第二列的降序排序。我尝试使用Python中内置的sorted()函数,但它给了我一个错误信息:'TypeError' : 'float' object is unsubscriptable


3
抱歉,但那不是一个列表。那只是一个带有换行符的数字序列,而不是任何Python数据结构。请发布您遇到问题的实际代码以及列表的表示形式。 - Martijn Pieters
2
现在我们有一系列的Python列表; 是否存在外部列表? - Martijn Pieters
12
显然不是离题,因为这是在Python中排序二维列表的Google搜索结果中排名第一,并且最佳答案获得了15个赞。 - JeffThompson
1
同意。如果StackOverflow解释了为什么这是不适合的,我们可以改进它。这是一个典型的问题,询问如何在Python中完成一个非平凡任务,而该任务有多种方法,如下所示。 - yellowjacket05
2个回答

68
您可以使用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]]

谢谢您的回答,非常有效,但是能否解释一下'l:l[1]'是什么意思? - Ricardo Sanchez
4
Lambda是Python中的小匿名函数,l是lambda的参数,在函数体后面用冒号 : 分隔。l[1]接收传递给lambda的列表,并返回第二个元素(下标 [1]表示第二个元素...)。 - dawg

23

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


我尝试了这个,但由于我的第二列是浮点数,它给出了“TypeError”:'float' object is unsubscriptable。 - Chinthaka Nadun Ratnaweera
2
@ChinthakaNadunRatnaweera:不是的,那么你的列表并没有嵌套。你在外部列表中直接引用了浮点值。打印出你的列表并将其复制到你的问题中。 - Martijn Pieters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接