如何按列对多维数组进行排序?

54

有没有一种方法可以使用sort()方法或其他方法按列对列表进行排序?假设我有以下列表:

[
[John,2],
[Jim,9],
[Jason,1]
]

我希望对它进行排序,使其看起来像这样:

[
[Jason,1],
[John,2],
[Jim,9],
]

怎样才是最好的方法呢?

编辑:

现在我遇到了一个索引超出范围错误。我有一个二维数组,假设有1000行3列。我想按照第三列进行排序。这段代码正确吗?

sorted_list = sorted(list_not_sorted, key=lambda x:x[2])

请参见以下链接,了解如何使用NumPy按列对数组进行排序:https://dev59.com/SXE85IYBdhLWcg3wVR-g - duhaime
现在我遇到了一个索引超出范围的错误。我有一个二维数组,假设它有1000行3列。我想根据第三列对它进行排序。这段代码正确吗?sorted_list = sorted(list_not_sorted, key=lambda x:x[2]) - Web Hopeful
针对您的编辑,由于列表是从零开始索引的,因此x[2]是第三列。故事的寓意是,在“sorted”和“sort”函数中,您可以使用键和lambda或实际函数按某些规定进行排序。 - squiguy
6个回答

79

可以。内置函数 sorted 接受一个key参数:

sorted(li,key=lambda x: x[1])
Out[31]: [['Jason', 1], ['John', 2], ['Jim', 9]]

请注意,sorted 返回一个新列表。如果您想原地排序,请使用您的列表的 .sort 方法(该方法还方便地接受一个 key 参数)。

或者,您可以:

from operator import itemgetter
sorted(li,key=itemgetter(1))
Out[33]: [['Jason', 1], ['John', 2], ['Jim', 9]]

在Python维基上阅读更多内容


可能需要提到这将返回一个新列表。 - user2555451
2
确实。如果您想修改原始列表,可以使用 li.sort(key=whatever) - user2357112
我该如何获得自然排序呢?就像这里的排序是基于数字位置的,'411'将排在'67'之前。 - Abhishek Jain
1
@AbhishekJain 你的数据类型是字符串,这就是为什么“411”出现在“67”之前的原因。转换为数字 - bobobobo

14

你可以使用有关键字的 sorted 方法。

sorted(a, key=lambda x : x[1])

12

您可以使用 list.sort 函数,结合可选的 key 参数lambda 表达式

>>> lst = [
...     ['John',2],
...     ['Jim',9],
...     ['Jason',1]
... ]
>>> lst.sort(key=lambda x:x[1])
>>> lst
[['Jason', 1], ['John', 2], ['Jim', 9]]
>>>

这将对列表进行原地排序。


请注意,对于大型列表,使用 operator.itemgetter 而不是 lambda 会更快:
>>> from operator import itemgetter
>>> lst = [
...     ['John',2],
...     ['Jim',9],
...     ['Jason',1]
... ]
>>> lst.sort(key=itemgetter(1))
>>> lst
[['Jason', 1], ['John', 2], ['Jim', 9]]
>>>

“lambda”键到底是什么? - Web Hopeful
1
@user3024130 - lambda 创建了一个 key 参数的内联函数。我添加了一个链接以更好地解释。使用 lambda 与执行 def func(x): return x[1] 然后 lst.sort(key=func) 没有任何区别。 - user2555451
好的,那從高到低排序該怎麼做呢? - Web Hopeful
3
简单明了。请使用以下代码:lst.sort(key=lambda x:x[1], reverse=True)list.sort函数还接受一个可选参数reverse。如果将其设置为True,则列表将按从高到低的顺序进行排序。否则,它将按从低到高的顺序进行排序。 - user2555451

3
sorted(list, key=lambda x: x[1])

注意:这也适用于时间变量。

1
可选的key参数用于sort/sorted函数,它是一个函数。该函数将针对每个项目进行调用,并且返回值决定了排序的顺序。
>>> lst = [['John', 2], ['Jim', 9], ['Jason', 1]]
>>> def my_key_func(item):
...     print("The key for {} is {}".format(item, item[1]))
...     return item[1]
... 
>>> sorted(lst, key=my_key_func)
The key for ['John', 2] is 2
The key for ['Jim', 9] is 9
The key for ['Jason', 1] is 1
[['Jason', 1], ['John', 2], ['Jim', 9]]

将函数中的print去掉后,留下了。
>>> def my_key_func(item):
...     return item[1]

这个函数足够简单,可以作为一个lambda函数“内联”编写。
>>> sorted(lst, key=lambda item: item[1])
[['Jason', 1], ['John', 2], ['Jim', 9]]

0

以下解决方案适用于需要使用浮点数的情况。

table=sorted(table,key=lambda x: float(x[5]))
for row in table[:]:
    Ntable.add_row(row)

'


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