按行排序矩阵并保持列不变
我想要对一个矩阵进行升序排序,但要保持它的列不变。举个例子,我有这样一个矩阵:
my_scores = [
['1', 0.03, 0.4, 0.6, 0.01, 0.1],
['2', 0.02, 0.5, 0.7, 0.01, 0.1],
['3', 0.01, 0.5, 0.7, 0.02, 0.3],
['4', 0.01, 0.5, 0.7, 0.03, 0.4],
['5', 0.03, 0.1, 0.2, 0.03, 0.4],
]
第一列(索引为0)不需要排序,它只是一个信息列,用来表示元素的名称。我有一个向量 [1,2,3,4,5],它表示我应该先按第二列(索引为1)排序,然后按第三列,依此类推...
所以我的矩阵排序函数的输出结果会是:
[
['1', 0.03, 0.4, 0.6, 0.01, 0.1],
['5', 0.03, 0.1, 0.2, 0.03, 0.4],
['2', 0.02, 0.5, 0.7, 0.01, 0.1],
['4', 0.01, 0.5, 0.7, 0.03, 0.4],
['3', 0.01, 0.5, 0.7, 0.02, 0.3]]
举个例子,如果第二列的所有值都不一样,我只需要按第二列排序。但因为在第1和第5个元素的值是相同的,以及在第4和第3个元素的值也是相同的,所以我需要先按第三列排序,然后按第四列,再按第四列,最后按第五列...
1 个回答
3
你可以通过给 .sort()
函数传递一个 key
参数来改变排序的方式:
my_scores.sort(key=lambda row: row[1:], reverse=True)
这里的 lambda
函数会返回每一行去掉第一列的值,这样在排序的时候就不会考虑第一列的内容了。我们还要求进行 反向 排序,也就是说把大的值放在前面。
这样就会得到:
>>> my_scores = [
... ['1', 0.03, 0.4, 0.6, 0.01, 0.1],
... ['2', 0.02, 0.5, 0.7, 0.01, 0.1],
... ['3', 0.01, 0.5, 0.7, 0.02, 0.3],
... ['4', 0.01, 0.5, 0.7, 0.03, 0.4],
... ['5', 0.03, 0.1, 0.2, 0.03, 0.4],
... ]
>>> my_scores.sort(key=lambda row: row[1:], reverse=True)
>>> import pprint
>>> pprint.pprint(my_scores)
[['1', 0.03, 0.4, 0.6, 0.01, 0.1],
['5', 0.03, 0.1, 0.2, 0.03, 0.4],
['2', 0.02, 0.5, 0.7, 0.01, 0.1],
['4', 0.01, 0.5, 0.7, 0.03, 0.4],
['3', 0.01, 0.5, 0.7, 0.02, 0.3]]