使用参考订单自定义排序列表

时间:2012-01-09 23:16:29

标签: python string list

我想按每行第一个索引0中的值对数组进行排序。数组的格式如下:

['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,但保留数组的其余部分。此外,无法保证数组将包含correct_order列表中的每个“Rating”。

我在论坛上看到了类似的问题,但无法使它们适应我的数据集。对最简单的解决方案的任何帮助将不胜感激。

2 个答案:

答案 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]))

答案 1 :(得分:2)

Claudiu的答案已经足够好了。我的是微小的变化。据推测,如果lookup列表很大,correct_order dict会提高性能。

    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]])