【问题标题】:Sorting 2D list python [closed]排序二维列表python [关闭]
【发布时间】:2013-09-04 23:59:36
【问题描述】:

我有以下类型的列表

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

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

【问题讨论】:

  • 很抱歉,但这不是一个列表。那是带有换行符的数字序列,但不是任何 Python 结构。请发布对您而言失败的实际代码以及列表的表示形式。
  • 现在我们有了一个python列表序列;有外单吗?
  • 显然不是题外话,因为它是用 Python 对二维列表进行排序的 Google 搜索结果排名第一,最佳答案有 15 个赞成票。
  • 同意。如果 StackOverflow 解释了为什么这是题外话,我们可以改进它。问如何在 Python 中完成一项非平凡的任务是一个典型的问题,该任务有多种方法,如下所示。

标签: python list sorting multidimensional-array


【解决方案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]]

【讨论】:

  • 感谢您的回答,很高兴,但介意解释一下 'l:l[1]' 的作用吗?
  • lambda 是 Python 中的一个小型匿名函数。 l 是由 : 分隔的函数体的 lambda 参数。 l[1] 获取传递给 lambda 的列表并返回第二项(下标[1] 是第二项...)
【解决方案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) 调用适用于外部列表中的所有元素,但仅适用于嵌套的有序序列,而不适用于现在添加的一个浮点值。

【讨论】:

  • 我试过这个,但由于我的第二列是浮动的,它给了我 'TypeError' : 'float' object is unsubscriptable
  • @ChinthakaNadunRatnaweera:不,那么您的列表没有嵌套。您在外部列表中直接引用了浮点值。打印您的列表并将其复制到您的问题中。
猜你喜欢
  • 2013-08-30
  • 2015-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
  • 1970-01-01
相关资源
最近更新 更多