2012-01-09 59 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]])