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]を持っています。これは、最初に(インデックス1の)列2でソートし、次に列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 に答える