2012-01-09 23 views
1

我想在它的第一個指標作爲排序依據的值的數組,0,每個row.The陣列的形式如下:自定義排序列表使用的參考訂單

['AAA', 1, 2, -1] 
['BB+', 3, 2, 1] 
['AA-', 5, 4, 1] 
['AA+', 4, 2, 2] 

正如你可能會看到,我想按一些信用評級來排序。不幸的是,簡單地使用內置函數進行排序並不能提供正確的順序。我想要做的就是以某種方式指定的順序,例如:

correct_order = ['AAA', 'AA+',...,'BBB+', 'BBB', 'BB+',...] 

我能想象有無數的方法來做到這一點,可能沒有具體說明。我不擔心表演,因爲我永遠不會超過22行。

需要強調的一點是,排序將基於每行中的索引0,但保留數組的其餘部分。另外,不能保證該數組將包含正確順序列表中的每個「評級」。

我看到類似的問題在論壇上解釋,但一直無法使它們適應我的數據集。任何幫助最簡單的解決方案將不勝感激。

回答

3

您的主要,你可以使用等級字符串的索引正確排序的評級字符串列表:

>>> correct_order = ['AAA', 'AA+', 'BBB+', 'BBB', 'BB+'] 
>>> list(sorted("BBB BBB+ BB+ AAA AA+ BBB+ BBB AA+".split(), key=lambda s:correct_order.index(s))) 
['AAA', 'AA+', 'AA+', 'BBB+', 'BBB+', 'BBB', 'BBB', 'BB+'] 

它適應您的特定數據集(其中評級字符串是第一列表中的每個列表的元素):

correct_order = ['AAA', 'AA+',...,'BBB+', 'BBB', 'BB+',...] 
the_lists.sort(key=lambda l: correct_order.index(l[0])) 
+0

哈哈,好吧...這比我意識到的要簡單。非常感謝,這完成了它。 – donopj2 2012-01-09 23:23:16

2

Claudiu的答案已經足夠。礦是微小的變化。如果correct_order列表很大,假設lookup字典將略微提高性能。

the_lists = [['AAA', 1, 2, -1], 
     ['AA-', 5, 4, 1], 
     ['BB+', 3, 2, 1], 
     ['AA+', 4, 2, 2]] 

    correct_order = ['AAA', 'AA+', 'AA-', 'BBB+', 'BBB', 'BB+'] 
    lookup = dict([(y, x) for (x, y) in enumerate(correct_order)]) 
    the_lists.sort(key=lambda l: lookup[l[0]])