我想按每行第一个索引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”。
我在论坛上看到了类似的问题,但无法使它们适应我的数据集。对最简单的解决方案的任何帮助将不胜感激。
答案 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]])