如何按列对多维数组进行排序?
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 或实际函数按照sorted
和 sort
函数中的某些规定进行排序。
【参考方案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 -lambda
为 key
参数创建一个内联函数。我添加了一个链接以更好地解释。使用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])
【讨论】:
以上是关于如何按列对多维数组进行排序?的主要内容,如果未能解决你的问题,请参考以下文章