按行排序矩阵并保持列不变

3 投票
1 回答
7789 浏览
提问于 2025-04-17 20:16

我想要对一个矩阵进行升序排序,但要保持它的列不变。举个例子,我有这样一个矩阵:

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

撰写回答