2013-03-25 122 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