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

Posted

技术标签:

【中文标题】如何按列对多维数组进行排序?【英文标题】:How to sort multidimensional array by column? 【发布时间】:2013-12-09 14:07:40 【问题描述】:

有没有办法使用 sort() 方法或任何其他方法按列对列表进行排序?假设我有清单:

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

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

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

最好的方法是什么?

编辑:

现在我遇到了索引超出范围错误。我有一个二维数组,可以说 1000 行 b 3 列。我想根据第三列对其进行排序。这是正确的代码吗?

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

【问题讨论】:

见:***.com/questions/2828059/… 现在我遇到了索引超出范围错误。我有一个二维数组,可以说 1000 行 b 3 列。我想根据第三列对其进行排序。这是正确的代码吗? sorted_list = sorted(list_not_sorted, key=lambda x:x[2]) 响应您的编辑,由于列表是零索引的,是的 x[2] 是第三列。故事的寓意是,您可以使用键和 lambda 或实际函数按照 sortedsort 函数中的某些规定进行排序。 【参考方案1】:

如果所需数字是浮点数,以下解决方案对我有用。 解决方案:

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

'

【讨论】:

【参考方案2】:
sorted(list, key=lambda x: x[1])

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

【讨论】:

【参考方案3】:

是的。 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]]

Read more on the python wiki.

【讨论】:

可能要提一下,这将返回一个新列表。 确实如此。如果你想修改原始列表,那就是li.sort(key=whatever) 我怎样才能得到自然排序?就像这里根据数字位置排序的那样,“411”将首先排序,然后是“67”。 @AbhishekJain 您的数据类型是字符串,这就是“411”在“67”之前出现的原因。 Convert to number【参考方案4】:

您可以将list.sort 与可选的key parameter 和lambda expression 一起使用:

>>> 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”键到底是什么? @user3024130 - lambdakey 参数创建一个内联函数。我添加了一个链接以更好地解释。使用lambda 与使用def func(x): return x[1] 然后lst.sort(key=func) 没有什么不同。 好吧,这是有道理的。你会如何将它从高到低而不是从低到高排序? @user3024130 - 很简单。使用这个:lst.sort(key=lambda x:x[1], reverse=True)list.sort 还采用可选的 reverse 参数。如果设置为True,则列表从高到低排序。否则,从最低到最高。【参考方案5】:

sort/sorted 的可选参数key 是一个函数。为每个项目调用该函数,返回值确定排序的顺序

>>> 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]]

【讨论】:

【参考方案6】:

您可以使用带键的排序方法。

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

【讨论】:

以上是关于如何按列对多维数组进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

C#按多列对多维数组进行排序

如何按列对二维数组(锯齿状)进行排序[重复]

在C#中按列对二维数组进行排序

如何在javascript中对多维数组进行排序

如何针对 C、C++ 或 Fortran 中的另一个多维数组快速对多维数组进行十亿点排序?

如何在 PHP 中对多维数组进行排序 [重复]