python 数値を降順にソート(key=reverse不使用)

sorted関数にて、reverse=Trueとしないでリスト内の整数を降順にソートする方法を説明します。
基準となる列の正と負を反転したものを基準に昇順にソートすることで、結果的に基準となる列で降順にソートすることができます。処理は下記です。

sorted(リスト, key=lambda x:-x)


コードは下記です。
様々なリストを降順にソートし、「reverse=True」とする場合と「ソートの基準となる列の符号を反転した場合」の結果を出力しています。どちらも同じ結果になっていることがわかります。

#0, 正の整数、負の整数
l = [5, 3, 1, -4, -2, 0]
print(sorted(l, reverse=True))
print(sorted(l, key=lambda x:-x))
"""出力
[5, 3, 1, 0, -2, -4]
[5, 3, 1, 0, -2, -4]
"""

#0, 正の整数
l = [5, 3, 1, 4, 2, 0]
print(sorted(l, reverse=True))
print(sorted(l, key=lambda x:-x))
"""出力
[5, 4, 3, 2, 1, 0]
[5, 4, 3, 2, 1, 0]
"""

#0, 負の整数
l = [-5, -3, -1, -4, -2, 0]
print(sorted(l, reverse=True))
print(sorted(l, key=lambda x:-x))
"""出力
[0, -1, -2, -3, -4, -5]
[0, -1, -2, -3, -4, -5]
"""

本方法のメリットは段階的にソートする時に、1行のコードで任意の列を降順にソートできることです。下記コードでは血液型→体重の優先度で、血液型は昇順、体重は降順にソートしています。
段階的なソートについては下記をご確認ください。
python 段階的なソート | Hello, Pygineer (knuth256.com)

human = [
    #名前    ,    血液型, 体重
    ('tadasi',   'O',     50  ),
    ('kiyosi',   'O',     100 ),
    ('masasi',   'A',     70  ),
]
s1 = sorted(human, key=lambda x:(x[1], -x[2]))
print(*s1, sep="\n")
"""出力
('masasi', 'A', 70)
('kiyosi', 'O', 100)
('tadasi', 'O', 50)
"""

sorted関数にて、reverse=Trueとして任意の列のみを降順にソートする場合、複数回sorted関数をコールする必要があります。

human = [
    #名前    ,    血液型, 体重
    ('tadasi',   'O',     50  ),
    ('kiyosi',   'O',     100 ),
    ('masasi',   'A',     70  ),
]
s1 = sorted(human, key=lambda x: x[2], reverse=True)
print(*s1, sep="\n")
"""出力
('kiyosi', 'O', 100)
('masasi', 'A', 70)
('tadasi', 'O', 50)
"""
s1 = sorted(s1, key=lambda x: x[1]) 
print(*s1, sep="\n")
"""出力
('masasi', 'A', 70)
('kiyosi', 'O', 100)
('tadasi', 'O', 50)
"""

コメント

タイトルとURLをコピーしました