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

第 1 列(索引 0)不是为了排序,它只是一个指示元素名称的信息列。我有这个向量 [1,2,3,4,5] 说我应该首先按我的第 2 列(索引 1)然后按第 3 列排序,依此类推...

所以我的矩阵排序函数会输出:

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

例如,如果第 2 列的所有值都不同,我只需要按第 2 列排序,但由于它在 1 和 5 元素以及 4 和 3 元素中具有相同的值,我必须按第 3 列对它们进行排序,然后按第 4 列,然后是第 4 列,最后是第 5 列...

4

1 回答 1

3

您可以通过将key参数传递给.sort()函数来更改排序键:

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]]
于 2013-03-25T20:40:34.740 回答