2013-03-25 98 views
1

我想按行保存列来排序(升序)矩阵。 例如,我有这样的矩阵:按列保存列来排序矩阵

my_scores = [ 
     ['1', 0.03, 0.4, 0.6, 0.01, 0.1], 
     ['2', 0.02, 0.5, 0.7, 0.01, 0.1], 
     ['3', 0.01, 0.5, 0.7, 0.02, 0.3], 
     ['4', 0.01, 0.5, 0.7, 0.03, 0.4], 
     ['5', 0.03, 0.1, 0.2, 0.03, 0.4], 
     ] 

列1(索引0)是不对它进行排序只是表示元素的名称一个信息列。 我有这个向量[1,2,3,4,5],说我应该先排序我的列2(索引1),然后列3,依此类推...

所以我的矩阵分类功能将输出:

[ 
['1', 0.03, 0.4, 0.6, 0.01, 0.1], 
['5', 0.03, 0.1, 0.2, 0.03, 0.4], 
['2', 0.02, 0.5, 0.7, 0.01, 0.1], 
['4', 0.01, 0.5, 0.7, 0.03, 0.4], 
['3', 0.01, 0.5, 0.7, 0.02, 0.3]] 

例如,如果第2列的所有值是不同的我只需要通过柱2进行排序,但因为它具有在1层& 5的元件,4个& 3元素相同的值I必须按第3列,然后按第4列,然后按第4列,最后按第5列对它们进行排序...

回答

3

您可以更改排序键通过在key参数传递到.sort()功能:

my_scores.sort(key=lambda row: row[1:], reverse=True) 

lambda的密钥给出返回行减去初始列,排序时有效地忽略它。我们还要求一个反向排序,所以更大的值首先。

这导致:

>>> my_scores = [ 
...   ['1', 0.03, 0.4, 0.6, 0.01, 0.1], 
...   ['2', 0.02, 0.5, 0.7, 0.01, 0.1], 
...   ['3', 0.01, 0.5, 0.7, 0.02, 0.3], 
...   ['4', 0.01, 0.5, 0.7, 0.03, 0.4], 
...   ['5', 0.03, 0.1, 0.2, 0.03, 0.4], 
...  ] 
>>> my_scores.sort(key=lambda row: row[1:], reverse=True) 
>>> import pprint 
>>> pprint.pprint(my_scores) 
[['1', 0.03, 0.4, 0.6, 0.01, 0.1], 
['5', 0.03, 0.1, 0.2, 0.03, 0.4], 
['2', 0.02, 0.5, 0.7, 0.01, 0.1], 
['4', 0.01, 0.5, 0.7, 0.03, 0.4], 
['3', 0.01, 0.5, 0.7, 0.02, 0.3]] 
+0

你好谢谢:)ü可以解释我说,你所使用的lambda表达式的只是意思:键=拉姆达行:行[1:] – user2209128 2013-03-26 10:32:40

+0

@ user2209128:它创建一个匿名函数,为矩阵中的每一行调用它,并返回行的副本减去第一个元素。 'row [1:]'是一个分片,要求从第二个元素开始到最后一个副本。 – 2013-03-26 10:35:40