按行排序矩阵,保留列。

3

我想按行对矩阵进行升序排序,同时保留其列。
例如,我有这个矩阵:

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个元素具有相同的值,因此我必须按照第3列、第4列、第4列和最后是第5列进行排序...
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]]

嗨,谢谢 :) 你能解释一下你使用的lambda表达式的含义吗:key=lambda row: row[1:] - user2209128
@user2209128:它创建了一个匿名函数,对矩阵中的每一行进行调用,并返回去掉第一个元素后的行副本。row[1:]是一个切片,从第二个元素开始复制到结尾。 - Martijn Pieters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接