使用参考顺序自定义排序列表
我想按照每一行的第一个元素(也就是索引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,但其他的数组内容要保留不变。而且,数组中不一定会包含“评级”列表中的每一个项。
我在论坛上看到过类似的问题,但没能把那些解决方案应用到我的数据上。如果能提供一个最简单的解决办法,我将非常感激。
2 个回答
2
Claudiu的回答已经很好了。我这只是稍微改了一下。如果lookup
这个字典的使用,可能在correct_order
列表很大的时候,能让程序运行得更快一点。
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]])
4
作为你的关键,你可以使用评分字符串在一个正确排序的评分字符串列表中的索引:
>>> 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]))